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