JCMD的代码/内部部分包含哪些内容?
为基于JVM的服务标注docker容器的方法很棘手(众所周知)。 我很确定我们对容器的尺寸略微不足,并希望清除我在监控时看到的与特定jcmd(本机内存跟踪器)输出相关的一些问题。
问题:
- 是否由jcmd报告的“内部”包含直接字节缓冲区?
- 除了jcmd报告的“代码”之外还有什么代码缓存?
- 是否有一种很好的方法来限制jcmd报告的“代码”部分。 我阅读了https://docs.oracle.com/javase/8/embedded/develop-apps-platforms/codecache.htm,但这仅涵盖了代码缓存限制,建议保持JVM默认不变。
JCMD输出在这里。
直接字节缓冲区 JMX属性在这里。
一些背景细节:
设置:
- 基于Spring引导的应用程序
-
JVM选项:
-server -Xms1792m -Xmx1792m -XX:MetaspaceSize = 128M – XX:MaxMetaspaceSize = 192M -XX:+ UseG1GC -XX:+ UseStringDeduplication – XX:MaxDirectMemorySize = 256m -XX:NativeMemoryTracking = detail
- Docker容器2500MiB在AWS / EC2中运行
是否由jcmd报告的“内部”包含直接字节缓冲区?
(更新) ByteBuffer.allocateDirect
内部调用Unsafe.allocateMemory
, 它由内部部分中的NMT 计数 (由mtInternal
常量表示)。
相反,MappedByteBuffers(由FileChannel.map
)不会反映在NMT报告中,尽管它们肯定会影响从OS角度看进程使用的内存量。
除了jcmd报告的“代码”之外还有什么代码缓存?
用于维护已编译代码和生成的运行时存根的辅助VM结构:哈希表,代码字符串,适配器指纹等。与CodeCache本身相比,它们都相当小。 这些结构构成报告中的“malloc”部分,而CodeCache则进入“mmap”部分。
是否有一种很好的方法来限制jcmd报告的“代码”部分。
关闭分层编译( -XX:-TieredCompilation
)可能会减少“代码”使用的内存量,因为生成的代码会少得多。 但请确保您了解分层编译是什么以及它可能产生的性能影响。
- JPA:@PrimaryKeyJoinColumn(…)和@JoinColumn(…,insertable =?,updatable =?)相同?
- 如何使控制字符可见?
- 是否有可能为单个队列设置死信队列
- Selenium Webdriver远程设置
- HttpServletRequestWrapper,setReadListener / isFinished / isReady的示例实现?
- 如何修复HTTP错误提取URL。 在抓取时java中的状态= 500?
- Java(JNA) – 在DLL(C ++)库中找不到函数
- 如何在Java中卸载已加载的类?
- Spring Boot应用程序无法解析org.springframework.boot包