如何缩小java堆空间?

时间:2014-03-18 13:23:34

标签: java memory memory-management heap-memory

我有一个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的内存,一旦我的应用程序完成繁重的操作,堆就会增长到大约600 MB并且DROPS会恢复到大约20 MB?

1 个答案:

答案 0 :(得分:2)

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

  

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

     
      
  • 所需的最大GC暂停目标
  •   
  • 所需的应用程序吞吐量目标
  •   
  • 最小足迹
  •   
     

实施检查(按此顺序):

     
      
  1. 如果GC暂停时间大于暂停时间目标,则减少世代大小以更好地实现目标。
  2.   
  3. 如果满足暂停时间目标,则考虑应用程序的吞吐量目标。如果应用程序的吞吐量目标   没有得到满足,然后增加几代人的规模   更好地实现目标。
  4.   
  5. 如果同时满足暂停时间目标和吞吐量目标,则减少代数的大小以减少占用空间。
  6.   

修改

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