java 虚拟机优化
************************
编译优化
为了提高程序的执行效率,虚拟机会将热点代码编译为本地机器码
解释器:可以使用解释器快速启动程序,同时,如果编译器进行激进优化,导致程序不能正常执行,可以使用解释器来执行
编译器:将热点代码编译为本地机器码,提高程序执行效率
编译层次:C1(简单可靠的优化)、C2(深度优化,server模式下默认采用分层编译,C1和C2同时工作)
热点代码:方法块(编译方法)、代码块(对代码块所在方法进行编译)
热点代码判断:基于计数器的热点探测
************************
锁的优化
偏向锁获取:线程获取锁前,先检查对象头是否记录了当前线程的id,如果记录了当前线程id,则直接获取锁;否则检查对象标志位是否允许偏向锁,如果允许,尝试用cas操作将当前线程的id记录在对象头中,如果替换成功则获取偏向锁;如果失败,则表示有其他线程占有偏向锁,偏向锁撤销,将标志位标记为不适合偏向,尝试获取轻量级锁
偏向锁撤销:如果有线程持有偏向锁,其他线程尝试获取偏向锁失败,则偏向锁撤销,其他线程尝试获取轻量级锁
轻量级锁获取:线程在当前栈空间创建lock record,用于存储markword,然后尝试使用cas将对象头的mark word替换为指向lock record的指针,如果替换成功则获取轻量级锁,失败则自旋等待,自旋等待获取锁失败则将锁膨胀为重量级锁
轻量级锁释放:尝试用cas替换mark word,如果替换成功,则直接释放锁;如果替换失败,则表示锁已膨胀为重量级锁,有线程在等待获取锁,释放锁的同时唤醒其他等待的线程
轻量级锁撤销:线程占有轻量级锁,此时其他线程尝试获取轻量级锁失败,则轻量级锁撤销,膨胀为重量级锁