如何缩小java堆空间?
我有一个Java控制台应用程序,它使用DOM处理大型xml文件。 基本上它从数据库中获取的数据创建xml文件。 现在,正如你猜测它正在使用大量内存,但令我惊讶的是,它与糟糕的代码无关,而是与“java堆空间不缩小”有关。 我尝试使用这些JVM参数从Eclipse运行我的应用程序:
-Xmx700m -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=20
我甚至加了
-XX:-UseSerialGC
因为我发现并行GC忽略“MinHeap”和“MaxHeap”选项。 即使有所有这些选项我的应用程序的内存使用图形看起来像这样:
正如您所看到的,我的应用程序在某一时刻需要大约400 MB的堆空间,堆增长到大约650 MB,但几秒钟之后(当xml生成完成时)我的应用程序下降到12MB的已用堆,但是“堆大小” “保持在650 MB左右。 我的RAM需要650 MB! 这是古怪的,你不觉得吗?
**有没有办法强制JVS缩小可用堆大小,比如当前使用堆的150%?**就像,如果我的应用程序需要15 MB内存,堆大小约为20MB,当我的应用程序要求400 MB时在我的应用程序完成繁重的操作后,ram,堆增长到~600 MB并且DROPS回到~20 MB?
您应该使用Parallel collection并使用-XX:-UseAdaptiveSizePolicy。 文档适用于Java 1.5,但我找不到更新的内容。
默认情况下使用的-XX:+ UseAdaptiveSizePolicy与-XX:+ UseParallelGC垃圾收集器的实现已更改为考虑三个目标:
- 期望的最大GC暂停目标
- 期望的应用程序吞吐量目标
- 最小占地面积
实施检查(按此顺序):
- 如果GC暂停时间大于暂停时间目标,则减少世代大小以更好地实现目标。
- 如果满足暂停时间目标,则考虑应用程序的吞吐量目标。 如果未满足应用程序的吞吐量目标,则增加代的大小以更好地实现目标。
- 如果同时满足暂停时间目标和吞吐量目标,则减少代的大小以减少占用空间。
编辑
根据OP的建议添加“ – ”。