我有一个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的内存,一旦我的应用程序完成繁重的操作,堆就会增长到大约600 MB并且DROPS会恢复到大约20 MB?
答案 0 :(得分:2)
您应该使用Parallel collection并使用-XX:-UseAdaptiveSizePolicy。文档适用于Java 1.5,但我找不到更新的内容。
默认情况下使用-XX:+ UseAdaptiveSizePolicy的实现 -XX:+ UseParallelGC垃圾收集器已经改为考虑三个 目标:
- 所需的最大GC暂停目标
- 所需的应用程序吞吐量目标
- 最小足迹
实施检查(按此顺序):
- 如果GC暂停时间大于暂停时间目标,则减少世代大小以更好地实现目标。
- 如果满足暂停时间目标,则考虑应用程序的吞吐量目标。如果应用程序的吞吐量目标 没有得到满足,然后增加几代人的规模 更好地实现目标。
- 如果同时满足暂停时间目标和吞吐量目标,则减少代数的大小以减少占用空间。
醇>
修改强>
根据OP的建议添加“ - ”。