为基于JVM的服务标注docker容器的方法很棘手(众所周知)。我很确定我们对容器的尺寸略微不足,并希望清除我在监控时看到的与特定jcmd(本机内存跟踪器)输出相关的一些问题。
问题:
JCMD output就在这里。
Direct Byte Buffers JMX属性在这里。
一些背景细节:
设置:
JVM选项:
-server -Xms1792m -Xmx1792m -XX:MetaspaceSize = 128M - XX:MaxMetaspaceSize = 192M -XX:+ UseG1GC -XX:+ UseStringDeduplication - XX:MaxDirectMemorySize = 256m -XX:NativeMemoryTracking = detail
答案 0 :(得分:2)
jcmd?
报告的“内部”中是否包含直接字节缓冲区
(更新)
ByteBuffer.allocateDirect
内部调用Unsafe.allocateMemory
is counted,其中mtInternal
由NMT在内部部分(由https://github.com/luberda-molinet/FFImageLoading/issues/814#issuecomment-344677274常量表示)。
相反,MappedByteBuffers(由FileChannel.map
获得)不会反映在NMT报告中,尽管从操作系统的角度来看它们肯定会影响进程使用的内存量。
除了代码缓存之外还有什么其他内容在jcmd?
报告的“代码”中
用于维护已编译代码和生成的运行时存根的辅助VM结构:哈希表,代码字符串,适配器指纹等。与CodeCache本身相比,它们都相当小。这些结构构成报告中的“malloc”部分,而CodeCache则进入“mmap”部分。
是否有一种方法可以限制jcmd报告的“代码”部分。
关闭分层编译(-XX:-TieredCompilation
)
可能会减少“代码”使用的内存量,因为生成的代码会少得多。但请确保您了解分层编译是什么以及它可能产生的性能影响。