即使堆中有足够的空间,完全垃圾收集器也会一次又一次地运行

时间:2017-04-11 16:34:05

标签: java garbage-collection

我们检查了我们的Java应用程序的gc日志,发现即使堆中有足够的空间,整个gc也会一次又一次地运行。

有些人可以帮助我们了解我们的原因是什么?当堆作为足够的空白空间时,可以一次又一次地调用Full GC运行的原因。

添加样本GC日志

157864.497: [GC [PSYoungGen: 54016K->2480K(54592K)] 376436K->327940K(385792K), 0.0237780 secs] [Times: user=0.07 sys=0.01, real=0.03 secs] 
157864.520: [Full GC [PSYoungGen: 2480K->0K(54592K)] [PSOldGen: 325460K->89870K(303168K)] 327940K->89870K(357760K) [PSPermGen: 18527K->18527K(18816K)], 0.7729250 secs] [Times: user=0.75 sys=0.00, real=0.77 secs] 
157865.446: [GC [PSYoungGen: 50944K->1776K(54528K)] 140814K->91646K(357696K), 0.0103750 secs] [Times: user=0.03 sys=0.00, real=0.01 secs] 

2 个答案:

答案 0 :(得分:0)

你能否进一步说出你的问题?请提供更多详情,例如您正在使用的语言,您的问题或问题究竟是什么,是否有任何可以显示的代码段?

编辑:

Java GC是非确定性的,因此无法预见它何时会发生,如果有足够的堆空间,它甚至可能会运行。它也是世代的,所以它基本上根据它们的破坏的可能性命令对象。

取自http://java.ociweb.com/mark/other-presentations/JavaGC.pdf(第7-11页),GC有四个理由:

  1. 堆大小即将充满

  2. 所谓的"年轻空间"有许多物体。代

  3. 所谓的"终身空间有许多物品。代
  4. 总之,你无法知道它何时会运行。

    此外,您可以尝试Java - Full GC (Garbage Collector) happening a lot in short interval causing performance hit,看看答案是否可以帮助您。

答案 1 :(得分:0)

如果您观察GC日志,则表明:[PSPermGen:18527K-> 18527K(18816K)] 这清楚地表明你的PermGen空间不足了。

因此,为了解决这个问题,可以进一步增加PermGenSpace(可能会减少堆空间)。这可以通过使用VM Arg简单地完成:-XX:MaxPermSize = 512m。这里的样本量为512m,您可以根据自己的要求进行更改。

如果不重新启动Tomcat,也不要经常在生产系统上部署,因为这会非常快地耗尽你的PermGenSpace。

相关问题