1.解释器与编译器
在部分虚拟机(Sun HotSpot)中,Java程序是最初通过解释器进行解释执行的,当虚拟机发现某个方法或者代码块运行特别频繁,就会把这些代码认定为"热点代码"(Hot Spot Code),为了提高热点代码的执行效率,在运行时,虚拟机会将这些代码编译成与本地平台相关的机器码,并进行各种层次的优化,完成这个任务的编译器称为即时编译器(Just In Time Compiler),简称JIT编译器。
当前主流的商用虚拟机中都同时包含解释器与编译器,解释器与编译器两者各有优势:
当程序需要迅速启动和执行时,解释器可以首先发挥作用,省去编译的时间,立即执行。
当程序运行后,随着时间的推移,编译器逐渐发挥作用,把越来越多的代码编译成本地代码后,可以获得更高的执行效率。
HotSpot虚拟机内置了两个即时编译器,称为Client Compiler和Server Compiler,简称为C1和C2编译器。默认采用解释器和其中一个编译器直接配合的方式工作,程序使用哪个编译器取决于虚拟机运行的模式,用户也可以使用-client和-server参数去强制指定虚拟机运行在Client模式还是Server模式。
无论采用那种编译器,解释器与编译器搭配使用的方式在虚拟机中称为"混合模式"(Mixed Mode),用户可以使用参数-Xint强制虚拟机运行于"解释模式",这时候编译器完全不介入工作,全部代码都使用解释方式执行。
也可以使用参数-Xcomp强制虚拟机运行于"编译模式"(Compiled Mode),这时候将优先使用编译方式执行程序,但是解释器仍然要在编译无法进行进行的情况下介入执行过程,可以通过java -version查看当前模式。
为了在程序启动响应速度和运行效率之间达到最佳平衡,HotSpot虚拟机将会逐渐启用分层编译的策略,分层编译在1.6中出现,后来一直处于改进阶段,最终在1.7的server模式虚拟机中作为默认编译策略被开启。
第0层:程序解释执行,解释器不开启性能监控功能,可触发第1层编译。
第1层:也称为C1编译,将字节码编译为本地代码,进行简单可靠的优化,如有必要将加入性能监控的逻辑。
第2层:也称为C2编译,也是将字节码编译为本地代码,但是会启用一些编译耗时较长的优化,甚至会根据性能监控信息进行一些不可靠的激进优化。
这个过程中用C1编译器获得更高的编译速度,用C2编译器来获取更好的编译质量。
2.编译对象与触发条件
前文提到的热点代码有两类:
1.被多次调用的方法
2.被多次执行的循环体
循环体和方法一样,在进行编译时都是以整个方法作为编译对象(而不是单独的循环体)。
要知道一段代码是不是热点代码,是不是需要触发即时编译,这个行为称为热点探测,目前主要的探测判定方式有两种:
1.基于采样的热点探测:虚拟机周期性的检查各个线程的栈顶,如果发现某个方法经常出现在栈顶,那这个方法就是热点方法。
2.基于计数器的热点探测:虚拟机会为每个方法建立计数器,统计方法的执行次数,如果执行次数超过一定的阀值就认为它是热点代码。
HotSpot虚拟机就是采用了第2种探测方式,因此它为每个方法准备了两个计数器:方法调用计数器和回边计数器(统计方法内部循环体执行次数)。这两个阀值都可以通过参数来设置(P292)。
当超过一定的时间限度,如果方法的调用次数仍然不足以让它提交给即时编译器编译,那这个方法的调用计数器就会被减少一半,这个过程被称为调用计数器的热度衰减,而这段时间就称为此方法统计的半衰期,进行热度衰减的动作是在虚拟机进行垃圾回收时顺便进行的,可以使用参数-XX:-UseCounterDecay来关闭热度衰减,让方法计数器统计调用次数的绝对次数。还可以使用参数-XX:CounterHalfLifeTime设置半衰周期,单位是秒。回边计数器没有热度衰减。
3.编译过程
虚拟机的编译过程都是在后台运行的,用户也可以通过参数-XX:-BackgroundCompilation来禁止后台编译,禁止后台编译以后,当达到JIT的编译条件,执行线程向虚拟机提交编译请求后将会一直等待,直到编译过程完成后再开始执行编译器输出的本地代码。
方法调用:
回边调用:
分享到:
相关推荐
* 与平台无关性:Java虚拟机可以在不同的平台上运行,不需要重新编译代码。 * 跨平台性:Java虚拟机可以在不同的平台上执行Java代码,不需要修改代码。 * 高度可移植性:Java虚拟机可以在不同的平台上执行Java代码,...
《实战Java虚拟机——JVM故障诊断与性能优化》内容简介:随着越来越多的第三方语言(Groovy、Scala、JRuby等)在Java虚拟机上运行,Java也俨然成为一个充满活力的生态圈。本书将通过200余示例详细介绍Java虚拟机中的...
### Java虚拟机分析与优化关键知识点 #### 一、Java虚拟机基础知识 1. **Java虚拟机(JVM)概述** - Java是一种面向对象的编程语言,具有“一次编写,到处运行”的特点。 - Java代码通过编译器转换为字节码,由...
类加载是Java虚拟机启动时或运行时动态加载类的过程。它由类加载器系统执行,通常分为引导类加载器、扩展类加载器和应用程序类加载器。加载过程包括加载、验证、准备、解析和初始化五个阶段,确保加载的类符合规范且...
Java虚拟机(JVM)是实现Java技术的关键组件,它为Java程序提供了一个运行环境。Java程序在编写后会被编译成一种称为字节码的中间表示形式,这种字节码可以跨平台运行,因为JVM负责将字节码转换成机器代码。JVM的...
随着越来越多的第三方语言(Groovy、Scala、JRuby等)在Java虚拟机上运行,Java...《实战Java虚拟机——JVM故障诊断与性能优化》将通过200余示例详细介绍Java虚拟机中的各种参数配置、故障排查、性能监控以及性能优化。
Java虚拟机的内部结构包括类装载器、运行时数据区、执行引擎、本地方法接口和本地库。其中,类装载器负责加载类文件,运行时数据区存储线程的工作数据,执行引擎解析并执行字节码,本地方法接口允许JVM调用非Java...
该研究论文提出了一种基于KVM的嵌入式Java虚拟机优化方案,该方案对KVM的解释器进行了改造,引入了编译技术,并对KVM运行时的内存分配和回收机制进行了改进。 嵌入式Java虚拟机优化的重要性 嵌入式Java虚拟机优化...
Java虚拟机(JVM)是Java编程语言的核心组成部分,它为Java程序提供了跨平台的运行环境。Java程序在编写完成后,会被编译成字节码(.class文件),这些字节码可以在任何装有JVM的系统上运行,实现了“一次编写,到处...
在对Java虚拟机进行优化时,研究人员会分析虚拟机在运行时的具体表现,识别瓶颈和不足之处,并设计出相应的优化策略。优化的策略可以是多方面的,包括但不限于调整虚拟机参数、实现新的算法优化、调整数据结构等。...
通过深入学习《Java虚拟机(第二版)》,开发者不仅可以理解Java程序的运行机制,还能掌握性能优化、问题排查等高级技巧,提升自己的编程水平。这本书通常会详细讲解上述知识点,并提供丰富的示例和实践指导,帮助...
自1999年《Java虚拟机规范(第二版)》发布以来,尽管JDK在版本5时进行了重大更新,但直到2011年7月,《Java虚拟机规范(JavaSE7版)》才正式发布。这标志着JVM技术的持续演进和标准化进程的重要里程碑。随着时间...
根据提供的文件内容,以下是关于JAVA虚拟机(JVM)内存使用优化的知识点: 1. JVM内存优化的重要性:在运行Java应用程序时,尤其是涉及到大量数据查询和高并发操作的场合,系统可能由于内存溢出而不稳定。JVM内存...
《Java虚拟机规范(Java SE 7)》是Java开发者深入理解Java运行机制的重要参考资料,它详细阐述了Java虚拟机(JVM)的工作原理和内存管理机制... 在Java SE 7版本中,JVM进行了多项改进和增强,其中...
为了确保应用在各种设备上运行流畅,开发者需要关注JAVA虚拟机的性能优化。例如,减少内存分配,避免过度使用线程,合理使用缓存,以及遵循Android的内存管理最佳实践。 9. **ART与Dalvik的比较** ART相比Dalvik...