JVM 代码缓存超过 ReservedCodeCacheSize
JVM code cache exceeds ReservedCodeCacheSize
我在 docker 中有一个 java 应用程序 运行,在 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)
我的问题是这是否是预期的行为?如果是,那么是否可以计算最大代码缓存大小的实际限制?
谢谢!
本机内存跟踪报告中的 Code
不仅说明了代码缓存,还说明了一些其他内容。该报告包括:
- 固定大小 spaces 保留
mmap
:
- 代码缓存 - 240 MB;
- 代码缓存段的映射 - 代码缓存大小的 1/64 = 3.75 MB。
- 辅助 VM 结构
malloc
在本机堆中:
代码字符串、OopMaps、异常处理程序缓存、适配器处理程序表和其他用于维护生成的代码的结构。
这些结构是动态分配的;对它们没有专门的限制,但通常它们只占生成代码总量的一小部分(请参阅 NMT 报告 Code
部分中的 malloc=
行)。
注意 reserved
内存实际上并不消耗地址 space 以外的资源。对于分析实际内存使用情况,committed
更相关。
我在 docker 中有一个 java 应用程序 运行,在 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)
我的问题是这是否是预期的行为?如果是,那么是否可以计算最大代码缓存大小的实际限制?
谢谢!
Code
不仅说明了代码缓存,还说明了一些其他内容。该报告包括:
- 固定大小 spaces 保留
mmap
:- 代码缓存 - 240 MB;
- 代码缓存段的映射 - 代码缓存大小的 1/64 = 3.75 MB。
- 辅助 VM 结构
malloc
在本机堆中:代码字符串、OopMaps、异常处理程序缓存、适配器处理程序表和其他用于维护生成的代码的结构。
这些结构是动态分配的;对它们没有专门的限制,但通常它们只占生成代码总量的一小部分(请参阅 NMT 报告
Code
部分中的malloc=
行)。
注意 reserved
内存实际上并不消耗地址 space 以外的资源。对于分析实际内存使用情况,committed
更相关。