执行引擎执行代码底层实现
解释器
字节码解释器
java字节码->c++ ->硬编码(汇编)
其实是switch case 将java转成c++语言
模板解释器
java字节码 ->硬编码(汇编)
JIT即时编译
模板解释器直接编译成硬编码,存储在方法区
jvm三种执行方式(执行引擎执行java字节码的运行方式)
1、Xint 纯字节码解释器
2、Xcomp 纯即时编译斜体样式
3、Xminxed 混合式(默认)
为什么使用混合模式?
项目越大编译时间耗时过长
热机切冷机故障(阿里)
codeCache(内存生成热代码)
存放在 :方法区(原空间)
即时编译是什么?什么是热点代码
两种即时编译器:
c1 -clinet 如果触发即时编译 就是c1编译器
需要收集的数据较少,优化比较浅,执行效率(速度)慢
c2 -server 如果触发即时编译 就是c2编译器
触发条件比较苛刻,优化比较深(逃逸分析)
,执行速度快,编译时候较耗资源
异步执行 触发即时编译后 写入队列,消费线程进行消费
触发即时编译阈值
server模式1w次
client 1500次
热度衰减
隔一段时间 对即时编译缓存 进行2倍递减
热点代码缓存 codecache
InitialCodeCacheSize
server 2496k
client 160k
ReservedCodeCacheSize
分层编译
默认开启
系统启动初期采用c1 运行一段时间以后采用c2
优化相关
逃逸
全局变量:会产生逃逸
局部变量:不可能逃逸
分析
为什么进行逃逸分析?
栈上分配
开启逃逸分析就会进行栈上分配
HSDB工具查看
如果没有栈上分配,代码在堆里,开启逃逸分析生成的对象<10w次
标量替换
锁消除