如何缩小java堆空间?

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

-Xmx700m -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=20 

我甚至加了

 -XX:-UseSerialGC 

因为我发现并行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?

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

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

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

实施检查(按此顺序):

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

编辑

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