如何缩小java堆空间? [复制]

Posted

技术标签:

【中文标题】如何缩小java堆空间? [复制]【英文标题】:How to shrink java heap space? [duplicate] 【发布时间】:2014-04-24 05:10:28 【问题描述】:

我有一个使用 DOM 处理大型 xml 文件的 Java 控制台应用程序。基本上,它根据从数据库中获取的数据创建 xml 文件。 现在,正如您猜测的那样,它正在使用大量内存,但令我惊讶的是,这与错误代码无关,而是与“java 堆空间不缩小”有关。 我尝试使用这些 JVM 参数从 Eclipse 运行我的应用程序:

-Xmx700m -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=20

我什至添加了

-XX:-UseSerialGC

我发现并行 GC 会忽略“MinHeap”和“MaxHeap”选项。即使我的应用程序内存使用的所有这些选项图看起来像这样:

如您所见,在某一时刻,我的应用程序占用了 ~400 MB 的堆空间,堆增长到 ~650 MB,但几秒钟后(当 xml 生成完成时)我的应用程序下降到 12MB 的已用堆空间,但是“堆大小”保持在 ~650 MB。它需要 650 MB 的内存!这很奇怪,你不觉得吗?

**有没有办法强制 JVS 将可用堆大小缩小到当前使用堆的 150%?**例如,如果我的应用需要 15 MB 的内存,当我的应用询问时,堆大小约为 20MB对于 400 MB 的 ram,我的应用程序完成繁重的操作后,堆会增长到 ~600 MB,然后 DROPS 会恢复到 ~20 MB?

【问题讨论】:

@PeterBratton 对您可能重复的接受的答案是错误的。 @Marko 没关系。这是完全相同的问题。 @PeterBratton 这很重要。您正在向 OP 和其他所有人发送一条消息,表明其他问题的答案对于该问题是正确的。 @Marko 如果您有更好的答案,请发布,我很乐意为您投票。但我认为在本网站的两个地方以不同的方式回答相同的问题并不符合社区的利益。如果欺骗是错误的,你应该解释为什么在那里。无论哪种方式,根据我理解的堆栈交换原则,这都是重复的。 @MarkoTopolnik 你和彼得为什么不把它带到meta。假设没有关于重复问题和错误接受答案的问题(我目前找不到这样的问题),这将是一个很好的讨论,我们都可以得到一些明确的澄清。坦率地说,我认为你们都有正确的观点。 【参考方案1】:

您可能应该使用并行收集并使用 -XX:-UseAdaptiveSizePolicy。文档适用于 Java 1.5,但我找不到更新的内容。

默认使用的-XX:+UseAdaptiveSizePolicy的实现与 -XX:+UseParallelGC 垃圾收集器已更改为考虑三个 目标:

期望的最大 GC 暂停目标 理想的应用程序吞吐量目标 最小占用空间

实施检查(按此顺序):

    如果 GC 暂停时间大于暂停时间目标,则减少代大小以更好地实现目标。 如果达到暂停时间目标,则考虑应用程序的吞吐量目标。如果应用程序的吞吐量目标 没有得到满足,然后将世代的大小增加到 更好地实现目标。 如果同时满足暂停时间目标和吞吐量目标,则减少代的大小以减少占用空间。

编辑

根据 OP 的建议添加了“-”。

【讨论】:

是的!这成功了!使用“-XX:-UseAdaptiveSizePolicy”和“-XX:+UseParallelGC”似乎可以解决问题:)非常感谢! UseParellelGC 应该是默认值(我相信从 Java 1.4 开始)。 对不起,我使用了“-XX:-UseParallelGC”(注意“-”)。 “+”堆空间增长缓慢(与应用程序一起),它减慢应用程序,“-”它以通常的方式增长,但最终缩小;) 我会小心这些设置,因为它们实际上可能会损害您的性能。你确定你这样做不是出于对什么是“正确”的抽象意义吗? 我有一个 4 GB 内存的服务器和几台这样的 xml 处理机器。它们中的每一个都是单独的 jar 文件,每 30 秒工作一次。这就是为什么我不希望他们贪婪:)

以上是关于如何缩小java堆空间? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何诊断 Java 8 元空间泄漏?

Java内存分配(直接内存堆内存Unsafel类内存映射文件)

OutOfMemoryError 异常:Java 堆空间,如何调试...?

Java 堆空间 - -Xmx 是如何工作的?

Java垃圾回收算法

理解 JVM 内存分配和 Java 内存不足:堆空间