java – JCMD的代码/内部部分包含什么?
作者:互联网
为基于JVM的服务标注docker容器的方法很棘手(众所周知).我很确定我们对容器的尺寸略微不足,并希望清除我在监控时看到的与特定jcmd(本机内存跟踪器)输出相关的一些问题.
问题:
> jcmd报告的“内部”中是否包含直接字节缓冲区?
> jcmd报告的“代码”除了代码缓存之外还有什么?
>是否有一种很好的方法来限制jcmd报告的“代码”部分.我读了https://docs.oracle.com/javase/8/embedded/develop-apps-platforms/codecache.htm,但这只涵盖了代码缓存限制,建议保持JVM默认.
JCMD output就在这里.
Direct Byte Buffers JMX属性在这里.
一些背景细节:
设置:
>基于Spring Boot的应用程序
> JVM选项:
-server -Xms1792m -Xmx1792m -XX:MetaspaceSize = 128M –
XX:MaxMetaspaceSize = 192M -XX:UseG1GC -XX:UseStringDeduplication –
XX:MaxDirectMemorySize = 256m -XX:NativeMemoryTracking = detail
>在AWS / EC2中运行的Docker容器2500MiB
解决方法:
Are Direct Byte Buffers included in “Internal” as reported by jcmd?
(更新)
ByteBuffer.allocateDirect在内部部分内部调用Unsafe.allocateMemory,其中is counted由NMT表示(由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)
可能会减少“代码”使用的内存量,因为生成的代码会少得多.但请确保您了解分层编译是什么以及它可能对性能产生的影响.
标签:java,linux,memory-management,jvm,jcmd 来源: https://codeday.me/bug/20191006/1862983.html