为什么一个简单的 Java 进程的 core dump 那么大
写了一个非常简单的 java main 函数, 然后运行, 然后做 core dump, 竟然发现 core dump 竟然有 6.6G.
Java 程序:
public class ErrorExample {
public static void main(String[] args) throws InterruptedException {
Thread.sleep(600000);
}
}
做 core dump 和 2种不同的 heap dump.
gcore <pid>
$ ls -lah
-rw-rw-r-- 1 supra supra 6.6G Apr 30 00:26 core.276268
-rw-rw-r-- 1 supra supra 67M Apr 30 00:26 core.276268.gz
-rw-rw-r-- 1 supra supra 1.3M Apr 30 01:02 heap.bin
-rw-rw-r-- 1 supra supra 334K Apr 30 01:02 heap.bin.gz
-rw------- 1 supra supra 2.8M Apr 30 01:01 heap.hprof
-rw------- 1 supra supra 855K Apr 30 01:01 heap.hprof.gz
上面分别是使用不同工具得到的不同 dump 及进一步压缩过后的:
gcore 276268
得到core.276268
jhsdb jmap --binaryheap --pid 280038
得到heap.bin
jcmd 280038 GC.heap_dump heap.hprof
得到heap.hprof
.
可以看到 jhsdb
做出的最小, core dump 最大. 这很有可能是 JVM 保留了很多想用但是还没用到的内存.
查看JVM 当前使用的内存, 发现其实使用的很小:
$ jcmd 281746 GC.heap_info
281746:
garbage-first heap total 258048K, used 1744K [0x0000000707e00000, 0x0000000800000000)
region size 1024K, 2 young (2048K), 0 survivors (0K)
Metaspace used 155K, capacity 4486K, committed 4864K, reserved 1056768K
class space used 6K, capacity 386K, committed 512K, reserved 1048576K
然后查看使用的启动参数, 可以看到保留的最大的堆是将近4G(MaxHeapSize=4162846720), 保留的代码缓存区是240M(ReservedCodeCacheSize=251658240), 再加上其它, 比如 JDK 库, 元数据区等, 可能达到6G多.
$ jcmd 281746 VM.flags
281746:
-XX:CICompilerCount=4 -XX:ConcGCThreads=2 -XX:G1ConcRefinementThreads=8 -XX:G1HeapRegionSize=1048576 -XX:GCDrainStackTargetSize=64 -XX:InitialHeapSize=262144000 -XX:MarkStackSize=4194304 -XX:MaxHeapSize=4162846720 -XX:MaxNewSize=2497708032 -XX:MinHeapDeltaBytes=1048576 -XX:NonNMethodCodeHeapSize=5836300 -XX:NonProfiledCodeHeapSize=122910970 -XX:ProfiledCodeHeapSize=122910970 -XX:ReservedCodeCacheSize=251658240 -XX:+SegmentedCodeCache -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseG1GC
如果使用 pmap 查看这个进程的虚拟内存使用情况, 可以发现确实使用了6.6G(最后一行):
$ pmap -x 280038
280038: java ErrorExample
Address Kbytes RSS Dirty Mode Mapping
0000000707e00000 256000 328 328 rw--- [ anon ]
0000000717800000 2758656 0 0 ----- [ anon ]
00000007c0000000 1048576 0 0 ----- [ anon ]
............ 省略 ....................
00007f39c513e000 8 8 0 r---- ld-linux-x86-64.so.2
00007f39c5178000 8 8 8 rw--- ld-linux-x86-64.so.2
00007ffc854ed000 132 32 32 rw--- [ stack ]
ffffffffff600000 4 0 0 --x-- [ anon ]
---------------- ------- ------- -------
total kB 6821276 37464 10660