jvm代码缓存超过reservedcodecachesize

iszxjhcz  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(390)

我有一个java应用程序在docker中运行,openjdk8上有标志:

-XX:+UseContainerSupport -XX:MaxRAMPercentage=80.0 -XX:NativeMemoryTracking=summary

我注意到本机内存跟踪工具报告的代码缓存内存分配超过了 240MB (默认值) ReservedCodeCacheSize 值):

jcmd 1 VM.native_memory summary | grep -i code
-                      Code (reserved=260013KB, committed=60465KB)

哪个是 ~ 254MB 保留内存。下面是打印的标志和java版本:

java -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsFinal -version | grep -i reserved
    uintx ReservedCodeCacheSize                     = 251658240                           {pd product}
openjdk version "1.8.0_262"
OpenJDK Runtime Environment (build 1.8.0_262-b10)
OpenJDK 64-Bit Server VM (build 25.262-b10, mixed mode)

我的问题是这是否是预期的行为?如果是,那么是否可以计算最大代码缓存大小的实际限制?
谢谢!

kfgdxczn

kfgdxczn1#

Code 在本机内存跟踪报告中,帐户不仅仅是代码缓存,还有其他一些东西。报告包括:
保留的固定大小空间 mmap :
代码缓存-240 mb;
代码缓存段的Map-代码缓存大小的1/64=3.75 mb。
辅助虚拟机结构 malloc 'ed在本机堆中:
代码字符串、oopmaps、异常处理程序缓存、适配器处理程序表和其他用于维护生成代码的结构。
这些结构是动态分配的;它们没有专门的限制,但通常只占生成代码总数的一小部分(参见 malloc= 中的行 Code nmt报告的章节)。
请注意 reserved 内存实际上并不消耗地址空间以外的资源。为了分析真实的内存使用情况, committed 更相关。

相关问题