我们检查了我们的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]
答案 0 :(得分:0)
你能否进一步说出你的问题?请提供更多详情,例如您正在使用的语言,您的问题或问题究竟是什么,是否有任何可以显示的代码段?
编辑:
Java GC是非确定性的,因此无法预见它何时会发生,如果有足够的堆空间,它甚至可能会运行。它也是世代的,所以它基本上根据它们的破坏的可能性命令对象。
取自http://java.ociweb.com/mark/other-presentations/JavaGC.pdf(第7-11页),GC有四个理由:
堆大小即将充满
所谓的"年轻空间"有许多物体。代
总之,你无法知道它何时会运行。
此外,您可以尝试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。