如何缩小java堆空间?

gue*_*t86 8 java memory memory-management heap-memory

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

-Xmx700m -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=20
Run Code Online (Sandbox Code Playgroud)

我甚至加了

-XX:-UseSerialGC
Run Code Online (Sandbox Code Playgroud)

因为我发现并行GC忽略"MinHeap"和"MaxHeap"选项.即使我的应用程序的内存使用所有这些选项图形看起来像这样: java app graph

正如您所看到的,我的应用程序在某一时刻需要大约400 MB的堆空间,堆增长到大约650 MB,但几秒钟之后(当xml生成完成时)我的应用程序下降到12MB的已用堆,但是"堆大小" "保持在650 MB左右.我的RAM需要650 MB!这是古怪的,你不觉得吗?

**有没有办法强制JVS将可用堆大小缩小到150%当前使用的堆?**就像,如果我的应用程序需要15 MB内存,堆大小约为20MB,当我的应用程序要求400 MB时在我的应用程序完成繁重的操作后,ram,堆增长到~600 MB并且DROPS回到~20 MB?

mtt*_*brd 2

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

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

  • 期望的最大 GC 暂停目标
  • 期望的应用程序吞吐量目标
  • 最小占地面积

实施检查(按此顺序):

  1. 如果 GC 暂停时间大于暂停时间目标,则减少代大小以更好地实现目标。
  2. 如果满足暂停时间目标,则考虑应用程序的吞吐量目标。如果未满足应用程序的吞吐量目标,则增加代的大小以更好地实现目标。
  3. 如果暂停时间目标和吞吐量目标都得到满足,则减少代的大小以减少占用空间。

编辑

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