目录
- 1 HotSpot VM的历史
- 2 HotSpot VM 概述
1 HotSpot VM的历史
Oracle/Sun JDK 中使用的 JVM 是 HotSpot VM.
SUN 的 JDK 版本从 1.3.1 开始采用 HotSpot 虚拟机, 并于 2006 年底开源, 主要使用C++实现, JNI 接口部分用C实现.
HotSpot 是较新的 JVM, 用来替代 JIT (Just in Time, 即时编译), 可以大大提高 Java 的运行性能, 即:
Java 起初是把源代码编译为 .class 格式的字节码在虚拟机上执行, 速度较慢;
HotSpot 将常用的部分代码编译为本地(native)代码, 显著提高了性能.
HotSpot JVM 参数分为标准参数(standard options)、非标准参数(non-standard options) 以及非稳定参数, 可参考: GC学习入门 看这一篇就够了(基于Oracle JDK 8)
2 HotSpot VM 概述
HotSpot 包括一个解释器和两个编译器(client 和 server, 实际运行中二选一), 解释与编译混合执行模式, 默认启动解释执行.
编译器: Java 源代码被编译器编译成 class 字节码文件, Java 字节码在运行时可以被动态编译(JIT)成本地代码(前提是解释与编译混合执行模式且虚拟机不是刚启动时).
解释器: 解释器用来解释 class 字节码文件, Java是解释型语言(区别于编译型语言).
① 解释型语言 编写的程序在运行时才编译, 再由专门的解释器解释执行 —— 每执行一次就要编译一次, 效率比较低.
② 编译型语言 编写的程序在运行前, 需要通过编译器将代码编译成机器语言, 然后直接由相应的操作系统执行.
这类语言编写的程序执行速度快, 同等条件下对系统要求较低, 因此像开发操作系统、大型应用程序、数据库系统等时都采用它, 如C/C++、Pascal等都是编译语言.
而一些网页脚本、服务器脚本及辅助开发接口这样的对速度要求不高、对不同系统平台间的兼容性有一定要求的程序则通常使用解释性语言,如Java、JavaScript、VBScript、Perl、Python、Ruby、MATLAB 等等。 [2]
解释性语言,例如java语言,java程序首先通过编译器编译成class文件,如果在windows平台上运行,则通过windows平台上的java虚拟机(VM)进行解释。如果运行在linux平台上,则通过linux平台上的java虚拟机进行解释执行。所以说能跨平台,前提是平台上必须要有相匹配的java虚拟机。如果没有java虚拟机,则不能进行跨平台。 [2]
server启动慢,占用内存多,执行效率高,适用于服务器端应用;
client启动快,占用内存小,执行效率没有server快,默认情况下不进行动态编译,适用于桌面应用程序。
java -version
Java HotSpot(TM) Client VM (build 14.3-b01, mixed mode, sharing)
mixed mode 解释与编译 混合的执行模式 默认使用这种模式
java -Xint -version
Java HotSpot(TM) Client VM (build 14.3-b01, interpreted mode, sharing)
interpreted 纯解释模式 禁用JIT编译
java -Xcomp -version
Java HotSpot(TM) Client VM (build 14.3-b01, compiled mode, sharing)
compiled 纯编译模式(如果方法无法编译,则回退到解释模式执行无法编译的方法)
3.动态编译
? 动态编译(compile during run-time),英文称Dynamic compilation;Just In Time也是这个意思。
? HotSpot对bytecode的编译不是在程序运行前编译的,而是在程序运行过程中编译的。
? HotSpot里运行着一个监视器(Profile Monitor),用来监视程序的运行状况。
? java字节码(class文件)是以解释的方式被加载到虚拟机中(默认启动时解释执行)。 程序运行过程中,那一部分运用频率大,那些对程序的性能影响重要。对程序运行效率影响大的代码,称为热点(hotspot),HotSpot会把这些热点动态地编译成机器码(native code),同时对机器码进行优化,从而提高运行效率。对那些较少运行的代码,HotSpot就不会把他们编译。
? HotSpot对字节码有三层处理:不编译(字节码加载到虚拟机中时的状态。也就是当虚拟机执行的时候再编译),编译(把字节码编译成本地代码。虚拟机执行的时候已经编译好了,不要再编译了),编译并优化(不但把字节码编译成本地代码,而且还进行了优化)。
? 至于那些程序那些不编译,那些编译,那些优化,则是由监视器(Profile Monitor)决定。
4.为什么不静态编译那?
? 为什么字节码在装载到虚拟机之前就编译成本地代码那?
? 动态编译器也在许多方面比静态编译器优越。静态编译器通常很难准确预知程序运行过程中究竟什么部分最需要优化。
? 函数调用都是很浪费系统时间的,因为有许多进栈出栈操作。因此有一种优化办法,就是把原来的函数调用,通过编译器的编译,改成非函数调用,把函数代码直接嵌到调用出,变成顺序执行。
? 面向对象的语言支持多态,静态编译无效确定程序调用哪个方法,因为多态是在程序运行中确定调用哪个方法。
参考:
http://www.cnblogs.com/zengkefu/p/5633342.html
版权声明
作者: ma_shoufeng(马瘦风)
出处: 博客园 马瘦风的博客
您的支持是对博主的极大鼓励, 感谢您的阅读.
本文版权归博主所有, 欢迎转载, 但未经博主同意必须保留此段声明, 且在文章页面明显位置给出原文链接, 否则博主保留追究法律责任的权利.
原文地址:https://www.cnblogs.com/shoufeng/p/9736148.html