释放Java堆空间。

3
我在Java性能方面遇到了问题。我尝试使用GC1,但效果并不好。我的唯一问题是,即使没有使用,JVM为什么还会保留Java堆空间?
如您所见,在批处理完成后大约在10:30左右,垃圾回收器没有被触发清理。因此,我在10:52手动进行了清理,然后使用的空间被释放,但JVM仍分配了堆(8GB)。为什么? Java Memory Problem
3个回答

3
我在做和你一样的事情时(参见这里),也注意到了这个趋势。简单地说,JVM即使有很多空闲内存也不会将内存归还给操作系统。我不知道具体原因,但这与从OS申请内存的成本高昂有关(这是极为简化的解释)。
所以,我猜这里的简单答案就是——这是正常现象。
这是我找到的实际阅读过此内容的地方!

谢谢您的回复。这很奇怪和烦人。已经两个星期了,一直在处理Java堆空间错误:( - Khalifa

1

G1GC可以与应用程序线程同时执行全堆操作,例如全局标记。 这可以防止与堆大小成比例的中断。

尽管G1GC是一种新时代的垃圾收集算法,但只有在以下情况下才应该从CMS或旧式垃圾收集切换:

  • 超过50%的Java堆用于存储实时数据。
  • 对象分配速率或晋升速率变化显着。
  • 不希望进行长时间的垃圾收集或压缩暂停(超过0.5到1秒)

有关G1内部工作的更多详细信息,请访问:http://docs.oracle.com/javase/7/docs/technotes/guides/vm/G1.html


1
我已经尝试过G1GC,但效果不佳。问题在于代码针对Java 6,最近迁移到Java 8引起了许多问题。但是我尝试了来自链接的-XX:GCTimeRatio=19 -XX:MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=30,它有所帮助。 - Khalifa

0

只有在应用程序需要额外内存时,GC才会被触发。GC是一项昂贵的任务,虚拟机会决定何时运行它。如果你怀疑你的程序需要内存而GC没有释放内存,这是一个问题。如果你能分享一个演示此问题的测试案例,我们将努力解决并修复此问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接