Java GC(分配失败)[PSYoungGen]
最近,我们将代码从java7切换到java8。PSYoungGen每10分钟就有一次GC分配失败。我们甚至尝试将开关-XX:NewSize和-XX:NewMaxSize设置为5GB左右(总堆大小为10GB)。但是,即使在gc分配失败被打印出来之后,PSYoungGen也会触发几乎与大小(5GB)相同的错误。添加了一些日志:Java GC(分配失败)[PSYoungGen],java,garbage-collection,Java,Garbage Collection,最近,我们将代码从java7切换到java8。PSYoungGen每10分钟就有一次GC分配失败。我们甚至尝试将开关-XX:NewSize和-XX:NewMaxSize设置为5GB左右(总堆大小为10GB)。但是,即使在gc分配失败被打印出来之后,PSYoungGen也会触发几乎与大小(5GB)相同的错误。添加了一些日志: [GC (Allocation Failure) [PSYoungGen: 3145728K->114922K(3670016K)] 3145728K->1150
[GC (Allocation Failure) [PSYoungGen: 3145728K->114922K(3670016K)] 3145728K->115026K(5767168K), 0.2511084 secs] [Times: user=0.26 sys=0.14, real=0.25 secs]
[GC (Allocation Failure) [PSYoungGen: 4443141K->125893K(4718592K)] 4443261K->126229K(6815744K), 0.2318927 secs] [Times: user=0.42 sys=0.22, real=0.24 secs]
在其中一个答案中:与此相关,我看到这是正常的行为,只是好奇地想知道有什么方法可以克服这一点?谢谢。我认为您可能正在设置的
NewSize
控制着整个新一代的大小(由eden和幸存者空间组成),因此您的eden可能仍然没有足够的大小来直接分配给新的大型对象(例如,可能是大字节[])
我想问的是,即使您将新的设置为
5Gb
,我认为SurvivorRatio
默认值为8
将意味着大约1.25Gb
的幸存者空间,留下3.75GB
伊甸园。您是否可以分配高于或接近此大小的对象
关于没有这样的日志,在你的OP中链接到的答案中,接受的答案会做出评论
“较旧的JVM未打印GC,原因是GC周期较小
因此,也许这种情况一直在发生,而你直到现在才知道。有没有可能以前发生过这种情况,而你现在只是看到这种情况是由于jre8中引入了一些增加的日志记录而发生的?你知道你通常会进行什么样的分配(例如,它们的大小是否非常大)?我认为您可能设置的新闻大小控制着整个新一代(由eden和幸存者空间组成)的大小,因此您的eden可能仍然没有足够的大小来直接分配给新的大型对象(例如,可能是大字节[])主要的GC消耗仅在年轻一代,而不是老一代。我们为堆总共分配了10GB,其中5GB用于年轻一代。但在转移到java8之前,GC日志中没有此类分配失败。我质疑的是,即使将新的设置为5GB,我想()如果
SurvivorRatio
默认值为8
,我认为这意味着大约1.25Gb的幸存者空间,剩下3.75GB的eden。您是否可以分配接近此大小的对象?