1. Java中字节码、机器指令

字节码是指平常所了解的 .class 文件,通过 javac 命令编译成字节码。
机器指令是指机器可以直接识别运行的代码,字节码是不能直接运行的,JVM 通过解释字节码将其翻译成对应的机器指令,逐条读入,逐条解释翻译才能运行。很显然逐条的解释其执行速度必然会比可执行的二进制字节码程序慢很多,这是传统的JVM的解释器(Interpreter)的功能。为了提高执行速度,引入了 JIT 技术。

JIT:在运行时 JIT 会把翻译过的机器码保存起来,以备下次使用,从而提高热点代码的执行效率。

热点代码:某个方法或代码块运行频繁。

2. JIT概述

Java程序还是通过解释器进行解释执行,当JVM发现某个方法或代码块运行特别频繁的时候,就会认为这是热点代码。然后JIT会把部分“热点代码”翻译成本地机器相关的机器码,并进行优化,然后再把翻译后的机器码缓存起来,以备下次使用。

当程序需要迅速启动和执行的时候,解释器可以首先发挥作用,省去编译的时间,立即执行。在程序运行后,随着时间的推移,编译器逐渐发挥作用,把越来越多的代码编译成本地代码之后,可以获取更高的执行效率。当程序运行环境中内存资源限制(如部分嵌入式系统中),可以使用解释器执行节约内存,反之可以使用编译执行来提升效率。

3 客户模式或服务器模式

HotSpot虚拟机中内置了两个JIT编译器:Client Complier和Server Complier,分别用在客户端和服务端,目前主流的HotSpot虚拟机中默认是采用解释器与其中一个编译器直接配合的方式工作

JVM Server 模式与 client 模式启动,最主要的差别在于:-server 模式启动时,速度较慢,但是一旦运行起来后,性能将会有很大的提升。原因是:当虚拟机运行在-client 模式的时候,使用的是一个代号为 C1 的轻量级编译器,而-server 模式启动的虚拟机采用相对重量级代号为 C2 的编译器。C2 比 C1 编译器编译的相对彻底,服务起来之后,性能更高。

通过 java -version 命令行可以直接查看当前系统使用的是 client 还是 server 模式。例如:

4 热点代码

JVM为每个方法分配一个调用计数器和为每个已执行的循环体配一个计数器(回边计数器)。如果一个具体方法的方法进入计数和循环边计数超过了由运行时设定的编译临界值,则认定它为性能关键的方法。运行时使用这些指标来判定这些方法本身或其调用者是否是性能关键的方法。

方法计数器:判断是否已存在编译版本,如已存在,则执行编译版本;否则,方法计数器+1,判断两个计数器之和(注意:是方法计数器和回边计数器的和)是否超过方法计数器阈值,超过则向编译器提交编译请求,这个方法将排队等待编译。不超过阈值情况仍旧解释执行该方法。

注意:该计数器并不是绝对次数,而是相对的执行次数,即在一段时间内的执行次数,当超过一定的时间限度,若还是没有达到阈值,那么它的计数器会减少一半,此过程被称为热度衰减。

注意:回边计数器:当两个计数器之和超过阈值的时候,它向编译器提交OSR编译,并且调整回边计数器值,然后仍旧以解释方式执行下去。
PS:该计数器是绝对次数,没有热度衰减。

编译的代码存在在一个称为“代码缓存”的缓存里。JIT除了具有缓存编译的代码功能外,还会对代码做各种优化,例如:逃逸分析、锁消除、锁膨胀、方法内联、数据边界检查、空值检查消除、类型检测消除、公共子表达式消除等。

5. 逃逸分析

逃逸分析的基本行为就是分析对象动态作用域。当一个对象在方法中被定义后,它可能被外部方法所引用。主要分为以下两类:

  • 方法逃逸:当一个对象在方法里面被定义后,它可能被外部方法所引用
  • 线程逃逸:当一个对象在方法里面被定义后,它可能被外部线程访问到

根据逃逸分析证明一个对象不会逃逸到方法或线程中,则进行高效的优化:

  1. JVM中,对象一般在堆中分配,堆是线程共享的,进行垃圾回收和整理内存都是消耗时间的。所有确定一个对象不会逃逸时,让对象从栈上分配内存可以缓解垃圾回收的压力。
  2. 如果确定一个变量不会逃逸出线程,则消除掉变量的同步措施,也成为锁消除。
  3. 标量替换或者分离对象:
    标量是一个数据已经无法再分解成更小的数据,JVM中的原始数据类型(int、long等数值类型以及reference类型等)。反之为聚合量即Java对象。如果对象不会逃逸,则不创建该对象。方法执行时直接创建若干个相关的变量来替代。并且对象拆分后,对象的成员变量在栈上分配和读写,为进一步优化提供条件。

在Java代码运行时,通过JVM参数可指定是否开启逃逸分析,

-XX:+DoEscapeAnalysis : 表示开启逃逸分析

-XX:-DoEscapeAnalysis : 表示关闭逃逸分析 从jdk 1.7开始已经默认开始逃逸分析

6. 方法内联

该方法是针对Client而言的,方法调用本身是有代价的,要从常量池找到方法地址,然后保存当前栈帧状态,压入新栈帧启动调用过程,调用完弹出,并恢复调用者栈帧。而在运行期,如果方法很频繁的执行,就会运行期把方法内联到调用者方法内部,减少频繁调用的开销。
看例子:


// 优化前
public static void foo(Object obj){Sout("do something");
}
public static void test(String[] args){Object obj = null;foo(obj);
}// 优化后
public static void test(String[] args){Object obj = null;Sout("do something");
}

JVM系列:JIT技术概述相关推荐

  1. 【光剑极简教程系列】“计算机科学与技术”概述Computer Science and Technology

    [光剑极简教程系列]"计算机科学与技术"概述 Computer Science and Technology 计算机科学是什么? 计算机科学,研究计算机及其周围各种现象和规律的科学 ...

  2. jvm系列(七):jvm调优-工具篇

    16年的时候花了一些时间整理了一些关于jvm的介绍文章,到现在回顾起来还是一些还没有补充全面,其中就包括如何利用工具来监控调优前后的性能变化.工具做为图形化界面来展示更能直观的发现问题,另一方面一些耗 ...

  3. JVM系列(一)--JVM运行时数据区

    随着时间的推移,我觉得有必要将一些之前相对模糊但是对自身技术提高会有帮助的原理.概念.实现进行一下系统的整理,所以就从JVM系列开始吧. 本系列主要参考<Java虚拟机规范(第二版)>.周 ...

  4. Java JVM堆空间的概述

    Java JVM堆空间的概述 1.设置堆空间初始值和最大值 2.堆的核心概述 内存细分 3.堆空间大小的设置 4.新生代与老年代 5.图解对象分配的过程 6.常用调优工具 7.Minor GC.Maj ...

  5. 【jvm系列-01】初识虚拟机与java虚拟机

    JVM系列整体栏目 内容 链接地址 [一]初识虚拟机与java虚拟机 https://blog.csdn.net/zhenghuishengq/article/details/129544460 [二 ...

  6. jvm与jit编译器的区别_了解jvm和jit编译器的第1部分

    jvm与jit编译器的区别 Hello people!! 大家好!! I can see that the Java community is growing a lot but there are ...

  7. Jvm 系列(八):Jvm 知识点总览

    对于Java程序员来讲,spring全家桶几乎可以搞定一切,spring全家桶便是精妙的招式,jvm就是内功心法很重要的一块,线上出现性能问题,jvm调优更是不可回避的问题.因此JVM基础知识对于高级 ...

  8. jvm系列(八):jvm知识点总览-高级Java工程师面试必备

    在江湖中要练就绝世武功必须内外兼备,精妙的招式和深厚的内功,武功的基础是内功.对于武功低(就像江南七怪)的人,招式更重要,因为他们不能靠内功直接去伤人,只能靠招式,利刃上优势来取胜了,但是练到高手之后 ...

  9. jvm系列(八):jvm知识点总览

    在江湖中要练就绝世武功必须内外兼备,精妙的招式和深厚的内功,武功的基础是内功.对于武功低(就像江南七怪)的人,招式更重要,因为他们不能靠内功直接去伤人,只能靠招式,利刃上优势来取胜了,但是练到高手之后 ...

最新文章

  1. VMware Workstation下安装Linux系统
  2. 3天,把MySQL索引、锁、事务、分库分表撸干净了!
  3. Kotlin和Java混合开发总结(基于Kotlin1.3.0版本)
  4. Eclipse中单元测试
  5. 雅马哈机器人左手右手系统_3名工人花1000元用两天拼装机器人,空气不好时自动喷水...
  6. Vue 犯罪指南:TypeError: Right-hand side of 'instanceof' is not an object
  7. mysql bat备份_Windows下简单的Mysql备份BAT脚本分享
  8. 华为抓取错误日志在哪里_分析Spider抓取情况和SEO优化
  9. 高性能迷你React框架anu发布
  10. 天涯明月刀java_天涯明月刀61副本 天涯明月刀副本详情介绍
  11. 高分一号和资源三号卫星数据产品的级别
  12. 如何编写简洁的代码?
  13. easyui导出excel科学计数法问题解决方法
  14. CMD命令创建文件夹快捷方式
  15. 五款好用的开源CRM系统推荐
  16. 云吟职中计算机老师,云吟职中暑期召开2017年职教高考总结研讨会
  17. 联想新计算机开机黑屏,联想笔记本电脑开不了机 联想笔记本电脑开机黑屏怎么办...
  18. layui表格时间格式化
  19. 物品丢失成为人们头痛的问题,苹果Find My帮助我们更好找到物品
  20. 银联无跳转支付流程(银联侧开通)

热门文章

  1. 超市销售管理系统---设计报告
  2. java 保存gif图片_java gif图片保存处理逻辑
  3. JS生成gif动态图下载
  4. 【HTML 教程系列第 19 篇】HTML 表格中的行合并与列合并
  5. AttributeError: 'NoneType' object has no attribute 'sc' 解决方法(二)
  6. JDK1.8的安装方式
  7. 二叉树递归(含非递归)遍历方式的流程图!
  8. 安卓开发入门教程!终于有人把安卓程序员必学知识点全整理出来了,附答案
  9. Eclipse中文语言包安装和设置中文Doc
  10. 使用ms17-010永恒之蓝漏洞渗透win7系统