【发布时间】:2015-09-19 07:43:35
【问题描述】:
当运行启用了本机内存跟踪的 Java 应用程序(在 YARN 中)时(-XX:NativeMemoryTracking=detail 请参阅 https://docs.oracle.com/javase/8/docs/technotes/guides/vm/nmt-8.html 和 https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr007.html),我可以看到 JVM 在不同类别中使用了多少内存。
我在 jdk 1.8.0_45 上的应用显示:
本机内存跟踪: 总计:保留=4023326KB,提交=2762382KB - Java 堆(保留=1331200KB,提交=1331200KB) (mmap:保留=1331200KB,提交=1331200KB) - 类(保留=1108143KB,提交=64559KB) (类#8621) (malloc=6319KB #17371) (mmap:保留=1101824KB,提交=58240KB) - 线程(保留=1190668KB,提交=1190668KB) (线程#1154) (堆栈:保留=1185284KB,提交=1185284KB) (malloc=3809KB #5771) (竞技场=1575KB #2306) - 代码(保留=255744KB,提交=38384KB) (malloc=6144KB #8858) (mmap:保留=249600KB,提交=32240KB) - GC(保留=54995KB,提交=54995KB) (malloc=5775KB #217) (mmap:保留=49220KB,提交=49220KB) - 编译器(保留=267KB,提交=267KB) (malloc=137KB #333) (竞技场=131KB #3) - 内部(保留=65106KB,提交=65106KB) (malloc=65074KB #29652) (mmap:保留=32KB,提交=32KB) - 符号(保留=13622KB,提交=13622KB) (malloc=12016KB #128199) (竞技场=1606KB #1) - 本机内存跟踪(保留=3361KB,提交=3361KB) (malloc=287KB #3994) (跟踪开销=3075KB) - Arena Chunk(保留=220KB,提交=220KB) (malloc=220KB)这显示了 2.7GB 的已提交内存,包括 1.3GB 的已分配堆和几乎 1.2GB 的已分配线程堆栈(使用许多线程)。
但是,当运行 ps ax -o pid,rss | grep <mypid> 或 top 时,它仅显示 1.6GB 的 RES/rss 常驻内存。检查交换说没有使用中:
为什么只驻留 1.6GB 内存时 JVM 指示已提交 2.7GB 内存?剩下的都去哪儿了?
【问题讨论】:
-
没有。该问题和答案讨论了保留但未提交的内存以及说已提交和常驻交换之间的区别,我指出这里不是这种情况。
-
答案还涵盖了已提交与常驻之间的差异。
-
它包括一句话“已经被调出(或从未调入)的东西可以被提交内存但不是常驻”,这远远不足以帮助我理解我的情况。这是我明确表示的一个原因,但是,在这里被调出并不是一个充分的解释。我开始怀疑堆栈内存(与 JVM 堆不同)似乎是预先提交的而没有成为常驻内存,并且随着时间的推移,只有在实际堆栈使用的高水位线之前才成为常驻内存。对此进行确认或解释将是一个有用的答案。
标签: linux memory jvm hadoop-yarn