【发布时间】: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。假设没有关于重复问题和错误接受答案的问题(我目前找不到这样的问题),这将是一个很好的讨论,我们都可以得到一些明确的澄清。坦率地说,我认为你们都有正确的观点。
标签: java memory memory-management heap-memory