使用并发标记清除垃圾收集器,配备超过120GB的RAM。

18
有人成功在Hotspot中使用Concurrent Mark Sweep垃圾收集器(UseConcMarkSweepGC)并且内存超过120GB吗?
如果我将-ms和-mx设置为120G,JVM可以正常启动,但如果我将它们设置为130G,JVM在启动时会崩溃。并行和G1收集器可以正常启动(但它们也有自己的问题)。
有人成功使用超过120GB堆大小的Concurrent Mark Sweep收集器吗?如果是这样,你是否需要做一些特殊的设置,还是我只是运气不好?
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提出了一个关于这个问题的错误报告(https://bugs.java.com/bugdatabase/view_bug?bug_id=7175901),但我想知道是否还有其他人遇到过这个问题。

4
如果可以的话,我会考虑使用更多的堆外内存。我的最大堆大小为1 GB,GC 大部分时间都是空闲的,而我经常使用 200-800 GB 的堆外内存。 - Peter Lawrey
谢谢 - 我计划使用堆外内存。然而,我仍然想尝试大堆大小,只是为了看看它们的表现如何。 - Neil
Full GC时间指南是每个老年代空间1GB大约需要1秒钟。Azul JVM是完全并发的(针对小型和完整收集),HotSpot GC是最佳努力并发的。;) - Peter Lawrey
仔细思考后,我想知道JVM是否正在尝试memmove超出实际包含jvm堆的非常大的mmap段(对于热点,JVM实际上创建了一个大的mmap私有文件,其中包含java堆),将内存移动到该段之外(或更准确地说是进程虚拟空间之外)将导致内核变得不稳定。 - Greg Bowyer
1
使用-server参数会出现这种情况吗? - CasualT
显示剩余2条评论
2个回答

3

1

我遇到了同样的问题。我们将毫秒(ms)降低到140以下,似乎可以解决问题。将mx保留在400g,并编写了一个测试程序。


很抱歉,我尝试了很多方法,但是没有成功——当JVM尝试将堆扩展到大约120G时仍然会崩溃。 - Neil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接