JIT

即时编译器(JIT)
1:解释器和编译器
    解释器省编译时间,省内存,编译器执行速度更快。
2:HotSpot内置了2个编译器,分别为Client Compiler(C1)和Server Compiler(C2)
3:HotSpot编译器采用分层编译。分层编译是虚拟机根据编译器编译、优化的规模和耗时,划分不同的编译层次
    0层:程序解释执行
    1层:C1编译,将字节码编译为本地代码,进行简单、可靠的优化,如有必要加入性能监控的逻辑。
    2层:C2编译,将字节码编译为本地代码,但是会启用一些编译耗时较长的优化。
    实施分层编译后C1和C2共同工作,许多代码都可能编译多次,用C1获取更高的编译速度,C2获得更好的编译质量。
4:编译对象和触发条件
    1)方法2)循环体:循环体最后编译的也是方法。在执行过程中替换:栈上替换(OSR)。
    探测方法:基于采样的热点探测:检查方法出现在栈顶的频率。基于计数器的热点探测。记录方法和循环体的执行次数。
5:基于计数器的热点探测
    方法调用计数器:当方法调用时检查是否被编译,未编译则计数+1,查看方法调用和回边计数器之和是否超过阈值,超过则请求编译,否则解释执行。
    回边计数器:在字节码中遇到控制流向后跳转的指令称为回边,过程和上面类似。
6:编译过程
    即时编译器和OSR编译请求过程中还是解释执行的,编译过程是在后台的编译线程中进行。可以禁止编译-XX:+BackgroundCompilation,禁止后会等待编译完成后执行。
    C1编译过程:第一阶段:将字节码构成一种高级中间代码表示。(HIR)第二阶段:从HIR中产生低级中间代码表示。(LIR)最后阶段:使用线性扫描算法在LIR上分配寄存器,并在LIR上做窥孔优化,然后产生机器代码。
    C2编译过程:专门面向服务器端的典型应用并为服务端的性能配置特别调整过的编译器,是一个被充分优化过的编译器。执行所有经典优化动作。
7:逃逸分析:逃逸的现象:定义一个方法,当做参数传递给其他方法,或者赋值给其他线程(线程逃逸)
   如果一个对象不会逃逸则可以进行一些高效的优化
    1)栈上分配:把对账分配到栈上可以随着方法的结束自动销毁。
    2)同步消除:线程同步本身是一个相对消耗的过程,不会线程逃逸,那这个变量的读写肯定不会存在竞争,这这个变量实施的同步措施也可以消除掉
    3)标量替换:标量是指数据已经无法分解为最小单位。原始类型和reference都可以称为标量。相对的叫聚合量比如对象。可以把对象拆散,可能就不用创建对象改为创建对象的成员变量,这样可以存放到栈上。
    

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值