你应该知道的关于 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 的运行性能,即:
HotSpot JVM 参数分为标准参数(standard options)、非标准参数(non-standard options) 以及非稳定参数,可参考: GC学习入门 看这一篇就够了(基于Oracle JDK 8) 2 HotSpot VM 概述HotSpot 包括一个解释器和两个编译器(client 和 server,实际运行中二选一),解释与编译混合执行模式,默认启动解释执行. 编译器: Java 源代码被编译器编译成 class 字节码文件,Java 字节码在运行时可以被动态编译(JIT)成本地代码(前提是解释与编译混合执行模式且虚拟机不是刚启动时). 解释器: 解释器用来解释 class 字节码文件,Java是解释型语言(区别于编译型语言).
解释性语言,例如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的编译不是在程序运行前编译的,而是在程序运行过程中编译的。 ? java字节码(class文件)是以解释的方式被加载到虚拟机中(默认启动时解释执行)。 程序运行过程中,那一部分运用频率大,那些对程序的性能影响重要。对程序运行效率影响大的代码,称为热点(hotspot),HotSpot会把这些热点动态地编译成机器码(native code),同时对机器码进行优化,从而提高运行效率。对那些较少运行的代码,HotSpot就不会把他们编译。 ? HotSpot对字节码有三层处理:不编译(字节码加载到虚拟机中时的状态。也就是当虚拟机执行的时候再编译),编译(把字节码编译成本地代码。虚拟机执行的时候已经编译好了,不要再编译了),编译并优化(不但把字节码编译成本地代码,而且还进行了优化)。 ? 至于那些程序那些不编译,那些编译,那些优化,则是由监视器(Profile Monitor)决定。 4.为什么不静态编译那? ? 为什么字节码在装载到虚拟机之前就编译成本地代码那? ? 动态编译器也在许多方面比静态编译器优越。静态编译器通常很难准确预知程序运行过程中究竟什么部分最需要优化。 ? 函数调用都是很浪费系统时间的,因为有许多进栈出栈操作。因此有一种优化办法,就是把原来的函数调用,通过编译器的编译,改成非函数调用,把函数代码直接嵌到调用出,变成顺序执行。 ? 面向对象的语言支持多态,静态编译无效确定程序调用哪个方法,因为多态是在程序运行中确定调用哪个方法。 参考: http://www.cnblogs.com/zengkefu/p/5633342.html
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |