我正在我的glassfish服务器上运行一个应用程序,我有以下JVM设置(我认为这些设置与我的问题相关):-Xmx512m -XX:NewRatio=2 -XX:+UseParallelOldGC -XX:+UseParallelGC所有其他设置都是默认的。在过去的48小时里,我一直在用JMC测试服务器性能,我注意到这一点: PS老Gen有大约341 MB的堆,PS Eden有大约143 MB的堆,PS Surviovor有大约13 MB的堆(这足够了吗?还是我应该使用不同的SurvivorRatio?)
图显示,在开始时,java堆有大约200 to的分配空间,但是在每个完整GC之后,它增长了大约450 to,甚至使用的堆(在每个完整GC之后)下降到了大约100 to,并且比缓慢增长到下一个小GC/full GC.为什么提交的java堆(红线)增加?这是正常行为吗?当它达到512 it时,它会停止吗?我应该使用从一开始提交的java堆为512 be的-Xms512m吗?

现在关于垃圾收集:小GC (PS清道夫)大约每1分钟运行一次,持续时间在10-30 PS左右。完整GC (PS MarkSweep)大约每14-18小时运行一次,最初的持续时间为200 PS,而最后一次的持续时间为20秒(我不知道为什么持续时间有这么大的差异)!我想知道这是否可以,如何取得更好的结果?我应该使用-XX:+UseConcMarkSweepGC -XX:+UseParNewGC,甚至是-XX:+UseG1GC吗?如果我使用这些GC中的任何一个,我将不得不增加最大堆大小(我看到UseG1GC只用于较大的堆)?我是否必须更改除GC类型之外的任何其他设置(如SurvivorRatio、NewRation、.)?
JMC中的GC持续时间是否等于停止世界暂停时间(还是暂停时间更短)?因此,如果我有20秒的GC持续时间为全部GC,这是否意味着我的服务器在20秒内没有响应?我的服务器上有JAX,我每10秒使用ajax调用其中一个(超时时间为10秒),这意味着至少有2个调用不会成功?在这种情况下,ajax调用的状态是什么(可能是错误)?我必须警告用户错误调用,我不知道在这种情况下,如果一个错误是由于GC暂停.
如果我有-Xmx1024m (比现在大两倍),那么完整的GC会更少见,但是它会持续更长的时间吗?
我读了很多关于JVM和JVM GC的文章,但是我仍然不知道我要做什么,所有的设置对于我的应用程序来说都是最优的(我担心最后20秒的GC持续时间长).
谢谢你的回答!
发布于 2015-05-17 20:25:13
完整GC (PS MarkSweep)大约每14-18小时运行一次,最初运行时间为200 PS,而最后一次运行时间为20秒。
尝试通过-XX:MaxGCPauseMillis设置暂停时间目标。
我应该使用-XX:+UseConcMarkSweepGC -XX:+UseParNewGC,甚至是-XX:+UseG1GC吗?
这当然是一种选择,但是由于并行收集器似乎能够在一开始就提供相当好的延迟,并且随着旧代的增加而变得更糟,所以您可能不需要这样做。
图显示,在开始时,java堆有大约200 to的分配空间,但是在每个完整GC之后,它增长了大约450 to,甚至使用的堆(在每个完整GC之后)下降到了大约100 to,并且比缓慢增长到下一个小GC/full GC.为什么提交的java堆(红线)增加?
因为您使用的是并行收集器,它的主要目标是吞吐量(如果没有对其进行限制,可能会损害内存占用或延迟)。而且,它可以提供最高的吞吐量,通过收集很少当大量的垃圾已经积累。
通过提供一个暂停时间目标,如果堆变得太大,无法满足暂停时间目标,它将停止增长。
如果我有-Xmx1024m (比现在大两倍),那么完整的GC会更少见,但是它会持续更长的时间吗?
有可能,但是一旦不能满足MaxHeapFreeRatio目标,GC就会停止堆的增长。
https://stackoverflow.com/questions/30288630
复制相似问题