Java 并行升级失败。。。原因是什么?

Java 并行升级失败。。。原因是什么?,java,garbage-collection,concurrent-mark-sweep,Java,Garbage Collection,Concurrent Mark Sweep,我正在运行一个使用3GB堆空间的java程序。过了一会儿,我在gc日志中注意到了这一点 应用时间:0.8263100秒 2015-03-13T07:24:49.065-0700:77177.620:[GC之前的GC: 二元医学的统计信息: 总可用空间:2960457 最大区块大小:1233864 楼宇数目:393 平均区块大小:7532 树高:19 在GC之前: 二元医学的统计信息: 总可用空间:0 最大区块大小:0 块数:0 树高:0 77177.620:[ParNew(0:升级失败大小=

我正在运行一个使用3GB堆空间的java程序。过了一会儿,我在gc日志中注意到了这一点

应用时间:0.8263100秒

2015-03-13T07:24:49.065-0700:77177.620:[GC之前的GC:

二元医学的统计信息:


总可用空间:2960457

最大区块大小:1233864

楼宇数目:393

平均区块大小:7532

树高:19

在GC之前:

二元医学的统计信息:


总可用空间:0

最大区块大小:0

块数:0

树高:0

77177.620:[ParNew(0:升级失败大小=2154)(1:升级失败大小=2154)(2:升级失败大小=2154)(3:升级 失败大小=2154)(4:升级失败大小=2154)(5:升级 失败大小=2154)(6:升级失败大小=2154)(7:升级 失败大小=2154)(8:升级失败大小=2154)(10:升级 失败大小=2154)(11:促销失败大小=2154)(12: 升级失败大小=2154)(13:升级失败大小=2154) (14:升级失败大小=2154)(15:升级失败大小= 2154)(16:升级失败大小=2154)(17:升级失败大小 =2154)(18:升级失败大小=2154)(19:升级失败大小=2154)(20:升级失败大小=2154)(21:升级失败大小=2154) 失败大小=2154)(22:促销失败大小=2154)(23: 升级失败大小=2154)(24:升级失败大小=2154) (25:升级失败大小=2154)(26:升级失败大小= 2154)(27:升级失败大小=2154)(升级失败): 346350K->333366K(393216K),0.3779580秒]77177.998:[CMSCMS:大 块0x00000007b7da3200

:2156277K->1695244K(2621440K),11.2619970秒] 2481226K->1695244K(3014656K),[CMS Perm: GC后的193077K->191199K(256000K)]:

二元医学的统计信息:


总可用空间:118536640

最大块大小:118536640

楼宇数目:1

平均区块大小:118536640

树高:1

GC之后:

二元医学的统计信息:


总可用空间:0

最大区块大小:0

块数:0

树高:0

,11.6404220秒][次:用户=16.85系统=0.04,实际=11.64秒]

停止应用程序线程的总时间:11.6432380 秒

申请时间:0.0421420秒

停止应用程序线程的总时间:0.0189740 秒

由于这个完整的GC,我的程序停止了11秒。这造成了巨大的性能问题。问题是,到处都有人在说[晋升失败=支离破碎]。如果是这样,那么为什么GC之前的最大块大小(1233864)仍然大于所有升级失败块大小(2154)的总和

我到处都查过了,没有找到这个问题的原因


这里有人知道这种情况持续发生的原因吗?

使用此收集器时,最大的问题是遇到升级失败,这是在收集年轻人和老年人之间发生竞争情况的情况。如果收集器需要将年轻对象升级到老一代,但没有足够的时间来清理空间,则必须首先这样做,这将导致完整的STW收集—这正是CMS收集器要防止的。为了确保不会发生这种情况,您可以增加旧一代(或整个堆)的大小,或者为收集器分配更多的后台线程,以与对象分配率竞争。

Hmm。。。但是如果你的情况(竞争条件)发生了,我不会得到一个并发模式失败,而不仅仅是升级失败。