网站首页 > java教程 正文
JVM底层原理之什么是JIT编译器?什么是HotSpot VM?
什么是JIT编译器(Just in time compiler),它的作用是?
众所周知,解释器的设计和实现上比较简单,执行程序的效率又比编译器编译出来的程序慢。java一开始也是如此,但是它并没有不思进取,为了解决这个问题,后面JVM就开始使用HotSpot VM这个java虚拟机了。
没错,JVM并不具体指代一种虚拟机,甚至当初有很多种JVM相互竞争,百家争鸣,当然随着时间的推移,逐渐统一了。
而HotSpot VM的一大功能就是JIT(Just in time compiler:即时编译器)。JIT也是一种编译器,所以它的功能也显而易见,就是将读取到的字节码文件编译成本地机器可以直接执行的机器语言。
但是它并不是完全将所有文件都编译后才执行的,如果是这样,那java就可以完全叫编译型语言了。JIT只会编译所谓的热点代码(也有叫热点方法、热点函数的),至于这个热点代码是如何判断检测的,我先放到后面再说。
总之最重要的是,它是在JVM启动后进行编译的,也就是解释器一边在启动运行程序,JIT一边默默的将热点代码编译为机器语言的指令,这种编译方式也被称为动态编译。
在程序初启动时,完全依靠解释器运行,编译器就像个拖油瓶,在那慢吞吞的准备。但是通过时间的推移,编译器的作用开始发挥了,越来越多的代码被编译成机器指令,这些复杂的代码不再需要通过解释器一行一行解释执行了,而是直接就可以通过编译出的机器码运行了,所以程序会越运行越快。
静态编译和动态编译:
静态编译就是在程序执行前的编译,它并不启动任何程序,只是相当于将整篇文章(源码)翻译了一遍。在Java中,将.java文件编译为.class文件就是静态编译,又名前端编译。
动态编译则是在程序运行时进行的编译,它在程序启动后才开始进行编译工作,在JVM中,JIT编译就是动态编译,它将字节码文件编译为本地的机器码,并进行优化,这又名后端编译。
什么是HotSpot VM?它和JIT的关系是?
HotSpot VM是一个由C++编写的Java虚拟机,也是目前范围最广的Java虚拟机,但它其实一开始并非Sun公司开发的,而是一个小公司设计的,只是后面被Sun发现并收购了而已。可能到这里我们才意识到,java虚拟机并不只有一家,另一个有名的是JRockit VM虚拟机。不过我们也无需担心,因为它也早在08年左右被Oracle一起收购了,我们现在只需要知道HotSpot VM就可以了。
HotSpot VM可以视为JVM的实现,它主要功能包括一个解释器和两个编译器,这两个编译器就可以合称为JIT编译器了。没错,JIT编译器并不是一个编译器,它是分为了两种模式的编译器:client模式和server模式。
client模式是一种轻量级编译器,也叫C1编译器,占用内存小,启动快,耗时短,它会进行简单并可靠的优化,更注重效率。
server模式是一种重量级编译器,也叫C2编译器,启动慢,占用内存大,耗时长,但编译的代码执行效率更高,甚至会根据性能监控信息进行一些不可靠的激进优化,更注重质量。
为啥注重质量却反而不可靠了呢?或许是因为对完美的追求太高了,进行了一些钻了牛角尖的优化吧。。但是不用担心,一般在方法优化失败时,程序会撤销C2编译的这部分代码,重新用解释器进行解释执行。
猜你喜欢
- 2024-09-16 读Java性能权威指南(第2版)笔记08_即时编译器中
- 2024-09-16 Java @SuppressWarnings:抑制编译器警告-4
- 2024-09-16 PHP 8.0正式发布:支持JIT编译器,性能提升高达3倍
- 2024-09-16 「深入理解java虚拟机」(一) - 编译器和字节码文件
- 2024-09-16 学习廖雪峰的JAVA教程---泛型(擦拭法由编译器实现强制转型)
- 2024-09-16 JVM底层原理之如何选用C1、C2编译器?它们有什么区别?
- 2024-09-16 JIT编译器的神奇之处:为什么Java如此快速
- 2024-09-16 C语言/C++/Java 入门到项目 资料和编译器
- 2024-09-16 如何在maven pom.xml文件中设置Java编译器版本
- 2024-09-16 Java后端精选基础教程:准备 Java 编译环境「连载 2」
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)