Java 堆大小减少

Posted

技术标签:

【中文标题】Java 堆大小减少【英文标题】:Java Heap Size Reduction 【发布时间】:2016-04-25 10:18:19 【问题描述】:

背景

我最近编写了一个消耗指定数量 MB 的 java 应用程序。我这样做是有目的的,以查看另一个 Java 应用程序如何对特定的 RAM 负载做出反应(我确信有用于此目的的工具,但这是最快的)。内存消费者应用程序非常简单。我输入我想要消耗的 MB 数并创建一个包含那么多字节的向量。我还有一个重置按钮,用于删除向量的元素并提示输入新的字节数。

问题

我注意到,一旦向量被清除,java 进程的堆大小就不会减少。我尝试了 clear(),但堆的大小保持不变。看起来堆随着元素而增长,但即使元素被删除,大小仍然存在。 java代码中有没有办法减少堆大小?是否有关于我缺少的 java 堆的详细信息?我觉得这是一个重要的问题,因为如果我想在任何 Java 应用程序中保持较低的内存占用,我需要一种方法来防止堆大小在很长一段时间内增长或至少不会变大。

【问题讨论】:

你看过了吗:***.com/questions/4952568/…。关于java堆大小控制有一些注意事项。 GC只在需要节省CPU消耗的时候运行。如果每次释放一些内存时都运行它,那么您的应用程序会非常慢。 有道理....感谢您的建议! 【参考方案1】:

通过调用System.gc()尝试垃圾收集

这可能会对您有所帮助 - When does System.gc() do anything

不建议大量调用 GC。

【讨论】:

【参考方案2】:

您应该使用 -Xmx 选项提供最大堆大小,并观察您的应用程序的内存分配。对生命周期短的对象也使用弱引用,GC会自动删除它们。

【讨论】:

以上是关于Java 堆大小减少的主要内容,如果未能解决你的问题,请参考以下文章

JVM 的堆大小不断增加(但 usedMemory() 不断减少)

减少 JVM 中未使用的堆大小

了解java虚拟机—堆相关参数设置

在保留一些堆信息的同时减少托管程序的小型转储的大小?

Java JVM 参数设置大全

Java JVM 参数设置大全