kul*_*lan 26 java garbage-collection
我遇到了一个相当令人困惑的GC情况:当Eden空间100%满时,使用0%的幸存空间.当伊甸园已满时,应该触发垃圾收集,对吧?
是否存在阻止GC守护程序运行的情况?像一个100%的CPU?
我们正在使用jdk-1.7.
可能是什么原因?下面是jmap输出.
我们还尝试使用捕获更详细的内存使用情况jmap -histo -F,但随后CPU使用率降至0%并且java进程无法访问.
using thread-local object allocation.
Parallel GC with 18 thread(s)
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 12884901888 (12288.0MB)
NewSize = 1310720 (1.25MB)
MaxNewSize = 17592186044415 MB
OldSize = 5439488 (5.1875MB)
NewRatio = 2
SurvivorRatio = 8
PermSize = 21757952 (20.75MB)
MaxPermSize = 85983232 (82.0MB)
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
PS Young Generation
Eden Space:
capacity = 4265738240 (4068.125MB)
used = 4265738240 (4068.125MB)
free = 0 (0.0MB)
100.0% used
From Space:
capacity = 14352384 (13.6875MB)
used = 0 (0.0MB)
free = 14352384 (13.6875MB)
0.0% used
To Space:
capacity = 14680064 (14.0MB)
used = 0 (0.0MB)
free = 14680064 (14.0MB)
0.0% used
PS Old Generation
capacity = 8589934592 (8192.0MB)
used = 8589931920 (8191.997451782227MB)
free = 2672 (0.0025482177734375MB)
99.99996889382601% used
PS Perm Generation
capacity = 41353216 (39.4375MB)
used = 41079056 (39.17604064941406MB)
free = 274160 (0.2614593505859375MB)
99.33702858805468% used
Run Code Online (Sandbox Code Playgroud)
ami*_*ngh 11
当我看到你的堆配置时,我发现了
MaxNewSize = 17592186044415 MB 不正确但它必须以字节为单位.
我所看到的几乎所有世代都充满同一时间,Collector并试图收集这两代人,以便他们相互阻挡.
我建议请用以下参数调整内存.
-XX:NewRatio=3 - the young generation will occupy 1/4 the overall heap
-XX:NewSize - Calculated automatically if you specify -XX:NewRatio
-XX:MaxNewSize - The largest size the young generation can grow to (unlimited if this value is not specified at command line)
Run Code Online (Sandbox Code Playgroud)
我还建议使用一些幸存者空间,当物体被复制eden到"终身" 时,它会给时间收集器.
-XX:SurvivorRatio=6 - each survivor space will be 1/8 the young generation
Run Code Online (Sandbox Code Playgroud)
如果幸存者空间太小,则复制集合会直接溢出到终身代.
如有任何澄清,请参阅此链接.
编辑:
-XX:NewRatio=3 - 年轻一代将占据整体堆的1/4
计算:
y/t=1/3
y+t=h
y+3y=h
y=h/4
t=tenured
y=young
h=heap
Run Code Online (Sandbox Code Playgroud)
线程本地缓冲区是从伊甸园空间分配的.一旦分配了缓冲区,伊甸园空间中的可用空间就会完全减少.这可能意味着你有许多几乎是空的TLAB,但伊甸园空间似乎已满.当伊甸园空间中没有足够的可用空间时,将触发GC.
如果关闭TLAB,-XX:-UseTLAB这将降低性能,但您可以更准确地计算空间的使用方式.