我有一个 Java 控制台应用程序,它使用 DOM 处理大型 xml 文件。基本上,它根据从数据库获取的数据创建 xml 文件。
现在,正如您猜测的那样,它使用了大量内存,但令我惊讶的是,它与错误代码无关,而是与“java 堆空间未缩小”有关。
我尝试使用以下 JVM 参数从 Eclipse 运行我的应用程序:
-Xmx700m -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=20
我什至添加了
-XX:-UseSerialGC
as i found out that parallel GC ignores "MinHeap" and "MaxHeap" options. Even with all those options graph of my app's memory use looks like this:
正如您所看到的,在某一时刻,我的应用程序占用了约 400 MB 的堆空间,堆增长到约 650 MB,但几秒钟后(当 xml 生成完成时)我的应用程序的已用堆空间减少到 12MB,但是“堆大小” " 仍保持在 ~650 MB。我的内存需要 650 MB!这很奇怪,你不觉得吗?
**有没有办法强制 JVS 将可用堆大小缩小到当前已用堆的 150%?**例如,如果我的应用程序需要 15 MB 的 RAM,则当我的应用程序要求 400 MB 时,堆大小约为 20MB当我的应用程序完成繁重的操作时,堆会增长到约 600 MB,然后又回落到约 20 MB?
您可能应该使用并行收集并使用 -XX:-UseAdaptiveSizePolicy。文档适用于 Java 1.5,但我找不到更新的内容。
-XX:+UseAdaptiveSizePolicy 的实现默认使用
-XX:+UseParallelGC 垃圾收集器已更改为考虑三个
目标:
- 期望的最大 GC 暂停目标
- 期望的应用程序吞吐量目标
- 最小占地面积
实施检查(按此顺序):
- 如果 GC 暂停时间大于暂停时间目标,则减少代大小以更好地实现目标。
- 如果满足暂停时间目标,则考虑应用程序的吞吐量目标。如果应用程序的吞吐量目标
没有得到满足,然后将世代的大小增加到
更好地实现目标。
- 如果暂停时间目标和吞吐量目标都得到满足,则减少代的大小以减少占用空间。
EDIT
根据OP的建议添加“-”。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)