Java GC(分配失败)[PSYoungGen]

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

最近,我们将代码从java7切换到java8。PSYoungGen每10分钟就有一次GC分配失败。我们甚至尝试将开关-XX:NewSize和-XX:NewMaxSize设置为5GB左右(总堆大小为10GB)。但是,即使在gc分配失败被打印出来之后,PSYoungGen也会触发几乎与大小(5GB)相同的错误。添加了一些日志:

[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。您是否可以分配接近此大小的对象?