java - JVM 代码缓存超过 ReservedCodeCacheSize
问题描述
我有一个在 OpenJDK8 上有标志的 docker 中运行的 java 应用程序:
-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
在 Native Memory Tracking 报告中不仅说明了代码缓存,还说明了其他一些内容。该报告包括:
- 固定大小的空间保留
mmap
:- 代码缓存 - 240 MB;
- 代码缓存段的映射 - 代码缓存大小的 1/64 = 3.75 MB。
malloc
在本机堆中的 辅助 VM 结构:代码字符串、OopMaps、异常处理程序缓存、适配器处理程序表和其他用于维护生成代码的结构。
这些结构是动态分配的;它们没有专门的限制,但通常它们只占总生成代码的一小部分(参见NMT 报告部分中的
malloc=
行)。Code
请注意,reserved
内存实际上并不消耗地址空间以外的资源。对于分析实际内存使用情况,committed
更为相关。
推荐阅读
- php - 如何在三重内连接表中显示适当的数据?
- ios - 自定义 UILongPressGestureRecognizer 无法使用 VoiceOver 的问题
- javascript - 我们能否在 oracle apex 中使全局页面上的区域不每次都加载(使其成为静态)。有没有办法限制它?
- reactjs - React Router v5 恢复滚动位置
- c# - 为什么在.Net C# 中从 MySql 读取后日期格式会发生变化?
- here-api - HERE API 直通航点
- python - Python 记录器忽略类中的 FileHandler 和 StreamHandler 级别
- gmail-addons - 如何发布 Google Docs 插件以便只有我的 G-Suite 中的人可以安装它?
- c# - 如何在我的实体上下文中直接访问我的 Auth0 令牌?
- python - Slack 通知不会在自定义标签上触发