JCMD 的 code/internal 部分包含什么?

What is contained in code/internal sections of JCMD?

为基于 JVM 的服务确定 docker 容器的尺寸是很棘手的(众所周知)。我很确定我们的容器尺寸略微不足,并且想解决一些与我们在监控时看到的特定 jcmd(本机内存跟踪器)输出有关的问题。

问题:

JCMD output来了

Direct Byte Buffers JMX 属性在这里。

一些背景细节:

设置:

Are Direct Byte Buffers included in "Internal" as reported by jcmd?

(更新) ByteBuffer.allocateDirect 内部调用 Unsafe.allocateMemory 其中 is counted by NMT in the Internal section (denoted by mtInternal 常量)。

相反,MappedByteBuffers(由FileChannel.map获得)没有反映在NMT报告中,尽管从OS的角度来看它们肯定会影响进程使用的内存量。

What else apart from code cache is in "Code" as reported by jcmd?

用于维护已编译代码和生成的运行时存根的辅助 VM 结构:哈希表、代码字符串、适配器指纹等。与 CodeCache 本身相比,它们都相当小。这些结构构成了报告中的 'malloc' 部分,而 CodeCache 进入了 'mmap' 部分。

Is there a good way to limit the "Code" section as reported by jcmd.

关闭分层编译(-XX:-TieredCompilation) 很可能会减少 "Code" 使用的内存量,只是因为生成的代码会少很多。但是请确保您了解什么是分层编译以及它可能对性能产生什么影响。