使用 RAM 超过 120GB 的并发标记扫描垃圾回收器

有没有人设法在拥有超过120GB RAM的热点中使用并发标记扫描垃圾收集器(UseConcMarkSweepGC)?

如果我将 -ms 和 -mx 设置为 120G,JVM 启动就好了,但是如果我将它们设置为 130G,JVM 就会在启动时崩溃。JVM 启动与并行和 G1 收集器很好(但它们有自己的问题)。

有没有人设法将并发标记扫描收集器与超过120GB堆一起使用?如果是这样,你是否必须做任何特别的事情,或者我只是在这里运气不好?

来自 JVM 错误转储的堆栈如下所示:

Stack: [0x00007fbd0290d000,0x00007fbd02a0e000],  sp=0x00007fbd02a0c758,  free space=1021k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C  [libc.so.6+0x822c0]  __tls_get_addr@@GLIBC_2.3+0x822c0
V  [libjvm.so+0x389c01]      CompactibleFreeListSpace::CompactibleFreeListSpace(BlockOffsetSharedArray*, MemRegion, bool, FreeBlockDictionary::DictionaryChoice)+0xc1
V  [libjvm.so+0x3d1ae0]  ConcurrentMarkSweepGeneration::ConcurrentMarkSweepGeneration(ReservedSpace, unsigned long, int, CardTableRS*, bool, FreeBlockDictionary::DictionaryChoice)+0x100
V  [libjvm.so+0x49d922]  GenerationSpec::init(ReservedSpace, int, GenRemSet*)+0xf2
V  [libjvm.so+0x48d0b9]  GenCollectedHeap::initialize()+0x2e9
V  [libjvm.so+0x824098]  Universe::initialize_heap()+0xb8
V  [libjvm.so+0x82657d]  universe_init()+0x7d
V  [libjvm.so+0x4cf0dd]  init_globals()+0x5d
V  [libjvm.so+0x80f462]  Threads::create_vm(JavaVMInitArgs*, bool*)+0x1e2
V  [libjvm.so+0x51fac4]  JNI_CreateJavaVM+0x74
C  [libjli.so+0x31b7]  JavaMain+0x97

我已经向Oracle提出了一个错误(http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7175901),但我想知道是否有其他人看过它。


答案 1

这似乎已经被Oracle接受为一个错误:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7175901


答案 2

有同样的问题。我们将毫秒降低到140以下,它似乎有效。将mx保持在400g并编写测试程序。