JIT 编译后的代码存储位置
JIT 编译后的代码存储位置
1. 存储位置
JIT 编译后的本地机器代码被存储在 JVM 的 Code Cache(代码缓存区)中。
Code Cache 是 JVM 内存的一部分,用于保存 JIT 编译生成的机器码,避免重复编译和提高代码执行效率。
2. Code Cache 的特性
- 作用:
- 存储 JIT 编译后的机器码。
- 提高热点代码的执行效率。
- 位置:
- Code Cache 是 JVM 内存的非堆区域,与堆、方法区等其他内存区域独立。
- 大小配置:
- Code Cache 的大小可以通过以下 JVM 参数调整:
-XX:InitialCodeCacheSize=<size>:初始大小。-XX:ReservedCodeCacheSize=<size>:最大大小。
- Code Cache 的大小可以通过以下 JVM 参数调整:
例如:
-XX:InitialCodeCacheSize=32m -XX:ReservedCodeCacheSize=256m
3. Code Cache 的管理
- Code Cache 的内容会随着 JIT 编译的执行逐步填充。
- 当 Code Cache 被填满时,JVM 会停止新的编译请求,从而可能导致程序性能下降。
- 为避免缓存溢出,可以通过监控工具(如 JConsole 或 VisualVM)检查 Code Cache 的使用情况,并调整配置参数。
4. 示例:监控 Code Cache
以下是一个监控 Code Cache 的示例工具:
使用jcmd查看 Code Cache 的状态
可以使用jcmd命令查看当前 JVM Code Cache 的使用情况:
jcmd <pid> Compiler.codecache
输出示例:
Code Cache:
size=245760Kb used=17326Kb max_used=18432Kb free=228434Kb
bounds [0x000000011b800000, 0x000000011ca00000, 0x000000011ca00000]
total_blobs=1021 nmethods=913 adapters=84
compilation: enabled
- size:Code Cache 的总大小。
- used:已经使用的大小。
- free:剩余可用空间。
- nmethods:JIT 编译生成的方法数量。
5. Code Cache 的生命周期
- 当 JVM 停止运行时,Code Cache 的内容会被清空。
- 在应用程序运行期间,JIT 编译器会动态管理 Code Cache 的内容,定期清理不再使用的代码,避免空间浪费。
6. 总结
- JIT 编译后的代码存储在 JVM 的 Code Cache 中。
- Code Cache 是 JVM 内存的一个独立区域,主要用于存储热点代码的机器码。
- 通过参数调整 Code Cache 大小,避免溢出问题。
- 可以使用工具(如 jcmd、JConsole)监控 Code Cache 的使用情况。
JIT 编译后的代码存储位置的更多相关文章
- webpack编译后的代码如何在浏览器执行
浏览器是无法直接使用模块之间的commonjs或es6,webpack在打包时做了什么处理,才能让浏览器能够执行呢,往下看吧. 使用commonjs语法 先看下写的代码, app.js minus.j ...
- php中,如何将编译后的代码,反编译回去。
编译后 <?php /*********************/ /* */ /* Version : 5.1.0 */ /* Author : RM */ /* Comment : 0712 ...
- KEIL MDK编译后的代码量和RAM使用详解
一般 MCU 包含的存储空间有:片内 Flash 与片内 RAM,RAM 相当于内存,Flash 相当于硬盘.编译器会将一个程序分为好几个部分,分别存储在 MCU 不同的存储区.Keil 工程在编译完 ...
- android 自定义用相机拍照后的照片存储位置
1.imageUri = Uri.fromFile(new File(Environment .getExternalStorageDirectory()+ File.separator + getP ...
- JD-GUI反编译后代码逻辑分析
一,用jd-gui.exe等工具查看源代码.如何你不会,可以参看此文章: http://blog.csdn.net/hp_2008/article/details/8207879 可以到以下连接下载可 ...
- jvm学习(3)方法区、堆、对象存储位置
方法区 方法区,Method Area, 对于习惯在HotSpot虚拟机上开发和部署程序的开发者来说,很多人愿意把方法区称为“永久代”(Permanent Generation),本质上两者并不等价, ...
- javac 编译与 JIT 编译
编译过程 不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转化成物理机的目标代码或虚拟机能执行的指令集之前,都会按照如下图所示的各个步骤进行: 其中绿色的模块可以选择性实现.很容易看出,上图中 ...
- Javac编译和JIT编译
编译过程 不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转化成物理机的目标代码或虚拟机能执行的指令集之前,都会按照如下图所示的各个步骤进行: 其中绿色的模块可以选择性实现.很容易看出,上图中 ...
- Javac编译与JIT编译
本文转载自:http://blog.csdn.net/ns_code/article/details/18009455 编译过程 不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转化成物理机的 ...
- 【深入Java虚拟机】之七:Javac编译与JIT编译
转载请注明出处:http://blog.csdn.net/ns_code/article/details/18009455 编译过程 不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转化成物理 ...
随机推荐
- 从存钱罐到子数组:一个关于累加和的精妙问题|LeetCode 560 和为K的子数组
LeetCode 560 和为K的子数组 点此看全部题解 LeetCode必刷100题:一份来自面试官的算法地图(题解持续更新中) 生活中的算法 你有没有这样的经历:每天往存钱罐里存一些零钱,某一天突 ...
- DBeaver连接SqlServer报“The server selected protocol version TLS10 is not accepted by client prefere”的错误
1.问题描述 DBeaver在连接SqlServer时,出现如下图所示的错误: The server selected protocol version TLS10 is not accepted b ...
- InfluxDB修改数据存储位置(二进制安装版)
InfluxDB修改数据存储位置(二进制安装版) 在二进制安装方式下,修改InfluxDB的数据存储位置通常涉及以下几个步骤.以下步骤以InfluxDB 2.x版本为例进行说明,因为InfluxDB ...
- 使用MTR网络诊断
安装 MTR Ubuntu: apt update apt upgrade apt install mtr-tiny CentOS: yum update yum install mtr 使用 MTR ...
- 【由技及道】SpringBoot启动即退出的量子纠缠诊断实录【人工智障AI2077的开发问题日志】
问题分析:这个Spring Boot怕不是属蜉蝣的? (人工智障OS:主人在容器环境部署的Spring应用生命周期堪比蜉蝣成虫--朝生暮死,启动即消亡) 现象观察: /usr/lib/jvm/jdk- ...
- mysql : 第5章 数据库的安全性
-- 创建用户CREATE USER utest@localhost IDENTIFIED BY 'temp';-- 查看所有用户SELECT * FROM mysql.user;-- 查看表级权限S ...
- LLM生成代码后,如何一键合并到源代码中(FastApply技术研究)
背景 在大语言模型越来越火的今天,越来越多的应用场景开始使用大语言模型来解决实际问题.而辅助编程可以算是大语言模型应用得最成功的场景之一了.早先的时候,更多使用的还是代码补全的能力,但是现在,各家产品 ...
- U盘制作、安装Ubuntu系统
制作 ubuntu U盘启动盘 下载Ubuntu镜像 打开 Ubuntu 官网:https://ubuntu.com/download/desktop ,进入页面后,点击右边的[Download]按钮 ...
- Xshell连接VirtualBox虚拟机中的CentOS
前提: 安装好VirtualBox虚拟机,并且在虚拟机上安装好CentOS系统. 具体步骤: 1.进入CentOS虚拟机设置--网络--高级--端口转发 2.新增端口规则,按照下面图片填写. 3.打开 ...
- 往EXCEL粘贴超长整数字段
写一个表格的HTML <table border="1"> <tr> <td>1</td> <td>1234567890 ...