《Oracle JRockit: The Definitive Guide》一书是由Oracle JRockit的两位资深开发人员写的,其中的Marcus Hirt更是JRockit Mission Control的leader,这本书详细的对Oracle JRockit进行了介绍,最突出的特点非常系统化的介绍了一个JVM通常是如何实现的,而JRockit这样一个极为优秀的JVM又是做了哪些优化,为 什么做这些优化,这本书对于对JVM感兴趣的同学而言应该是必读的一本书,其实即使对于JVM兴趣不强的同学,里面的优化思路的介绍也是值得学习,本系列 的blog主要是总结看这本书得到的一些收获,由于书中知识量巨大,因此得分成多篇blog来总结了。
书的第二章为:Adaptive Code Generation,在这章中作者向我们讲解了一个优秀的JVM是如何来实现代码的高效执行的,感兴趣的同学其实可以在不看下面blog内容之前,先考 虑下如果是你做的话,你会怎么做来实现Java代码的高效执行呢,然后再对比下这章的内容,我想你能学到很多的,:)
用过Java的同学都知道,Java是通过javac将Java源码编译为class文件,然后通过ClassLoader装载此class文件, 之后就可执行此class了,要最高效的执行这个class,最好的方法莫过于class文件直接就是机器码,这样直接执行就可以了,但Java是跨平台 的,因此class文件就不能是机器码了。
由于class文件不是直接的机器码,要执行它最简单的方法就是采用纯粹的解释方式,解释方式由于每次都得将class文件中的指令翻译为对应的机器环境的指令,效率是很低的。
为了能更高效的执行,同时又保持跨平台的特性,另外一个方法就是在执行class时再将其翻译为对应的机器码,这个方法是比较靠谱的,因此无论是 Hotspot、还是JRockit,都采用了这种方式,也就是大家熟知的JIT(Just In Time) Compiler。
OK,既然觉得在装载class后翻译成机器码去执行可以比较高效,那这个时候又会出现两种状况,是执行class的时候就立刻翻译成机器码,还是 先用解释模式执行,然后到一定时机再翻译成机器码呢,之所以出现这两种状况,原因在于将class翻译为机器码是需要消耗时间的,因此如果执行class 的时候就立刻翻译成机器码的话,也就会导致Java程序启动速度会比较慢,JRockit是这么认为的,JRockit的服务对象是server级应用, 这类应用的特点是没那么在乎启动速度,而更在乎的是执行时的高效,而且如果执行的时候就立刻翻译成机器码的话,就意味着压根不需要实现解释器,因此 JRockit采取的方法是在执行class时直接编译为机器码,而Hotspot由于需要同时支持client和server应用,对于client应 用而言,启动速度非常重要,因此Hotspot采用的是先解释执行,到了一定时机后再翻译成机器码。
如果认为就这样就完成了Java代码的执行的实现,那就太小看JVM了,由于JVM能够知道代码运行的全部状况,自然还可以做出更多更出色的提升代 码执行速度的优化,例如标量替换、更好的inline等,后面再来细说,因此这样就出现了一个状况,什么时候对哪些代码来做这些更猛的优化呢。
真正值得做更猛的优化的代码自然是所谓的”热点”代码,如何来发现哪些代码是热点代码呢,通常有三种方法:
1、方法调用计数器
方法调用计数器是常见的方式,hotspot采用的即为这种,这种方式不好的地方就在于计数器本身经常是cpu cache misses的,因此稍微会有点影响性能。
2、对线程进行采样
可采用软件或硬件方式来实现,软件方式实现不好的地方在于采样的时候需要暂停线程,好处是因为是采样,不需要对所有方法进行计数,硬件方式自然是最好的,但不是所有的硬件都支持的,支持的硬件中最典型的是intel IA-64的CPU。
在有了发现热点代码的方法后,接下来需要做的就是更猛的优化,有很多种,例如Java的代码中,通常会是接口方式的调用,但因为是接口方式的调用,
所以其实默认情况下是不好做inline处理的,但JVM为了更高效的执行代码,如发现这代码为热点代码,那么就会做一些激进的优化,例如会假设这个接口
只有一个实现,然后就可以直接将此实现对应的代码inline进来了(至于为什么inline后效率更高,这个请参考编译原理之类的书),这些激进优化同
样适合于if、抛异常这些状况,当然,当激进优化的条件失效时,就会逆优化回到之前基本编译的代码。
而其他的更猛的优化还包括根据线程执行路径进行逃逸分析等,后面再专门写一篇blog来讲解下一些翻译为机器码的优化吧,其实大多都是编译原理的一些东西。
书中在介绍JRockit如何实现自己的JIT Compiler时,提到了Bytecode混淆以及bytecode优化,JRockit的态度是bytecode混淆时将name进行混淆是靠谱的, 但如果对control flow进行混淆,就不太好了,因为这有可能会导致jit compile时的有些优化也做不了了,而bytecode优化,JRockit的态度是应该避免,因为没什么太大的意义,更主要的优化还是得靠jit compiler。
JRockit的JIT Compiler的实现和Hotspot另外一个很大的不同在于JRockit并未采用on-stack replacement,据JRockit的研究,这个没有太大必要,当然,对于编写benchmark代码时则要注意这个不同。
JIT Compiler在compile时还需要考虑的几个重点问题:
1、为GC提供必要的信息;
2、为查错提供必要的信息,例如代码的行数、变量名等;
从这章的内容可以看到,JRockit为了能够让Java代码能够高效的执行,是做出了非常多的努力的,也可以看到很多JRockit与Hotspot不同的地方,甚至可以看出Java代码的执行比C代码的执行高效都是有可能的,:)。
相关推荐
**JRockit JAVA内存溢出检测的使用** Java内存溢出是开发和运行Java应用程序时常见的问题,可能导致程序崩溃或性能急剧下降。JRockit JVM(Java Virtual Machine)由Oracle公司开发,它提供了强大的内存管理和分析...
Oracle JRockit是一款高性能、优化过的Java虚拟机(JVM),专为服务器端应用程序设计,尤其是在需要高吞吐量和低延迟的环境中表现卓越。它曾经是Oracle公司的一个重要产品,但现在已被Java HotSpot VM所取代,后者是...
它由Oracle公司开发,是Java应用程序的关键组成部分,负责运行和管理Java代码。标题中的"jrockit-jdk1.6.0_45-R28.2.7-4.1.0-linux-x64.bin"指的是一个特定版本的JRockit JVM,适用于Linux操作系统,基于x86_64架构...
JRockit还提供了动态编译器,能够将经常执行的热点代码编译为本地机器码,以提高执行速度。 然而,值得注意的是,自Oracle JDK 7u40开始,JRockit JVM已被弃用,并逐渐被HotSpot JVM所取代。这意味着对于新的开发和...
本教程提供在linux上用JRockit启动JAVA程序、在windows上启动JRockit检测内存泄漏的方法(远程连接),分为以下步骤:获得 JRockit、安装JRockit、指定LINUX要使用的JDK、修改JAVA程序启动参数、运行JRockit
- **动态编译**:JRockit的即时编译器(JIT)能够分析代码执行情况,将热点代码编译为原生机器码,提升运行效率。 - **飞行记录器**:JRockit的飞行记录器提供详细的运行时信息,用于分析和优化应用性能。 - **...
- **代码优化**:提供了大量关于编写高效Java代码的建议,包括避免内存泄漏、减少对象创建等最佳实践。 - **配置调整**:指导用户如何根据应用的特点合理设置JVM参数,例如-Xmx、-Xms等,以达到最佳性能平衡。 **4....
Java开发人员在面对复杂的应用系统时,经常遇到性能优化的问题,而Oracle JRockit JVM作为一款高效的Java虚拟机,尤其在内存管理和垃圾回收方面表现出色。"jrockit手册"是一份宝贵的资源,旨在帮助开发者深入理解...
Oracle JRockit是Oracle公司开发的一款高性能、低延迟的Java虚拟机(JVM),尤其在金融、电信等对实时性能要求极高的行业中得到了广泛应用。这本书详细介绍了JRockit的特性、工作原理以及如何利用这些知识来提升应用...
Oracle JRockit是一款高性能、轻量级的Java虚拟机(JVM),由BEA Systems开发,后被Oracle公司收购并整合到其产品线中。Oracle JRockit在Java应用程序的运行效率、内存管理和垃圾回收等方面表现出色,尤其适合对性能...
2. **动态编译**:JRockit包含了名为“JRockit Mission Control”的一套工具,其中包括一个实时编译器(Real Time Compiler),它能够在运行时将热点代码编译为机器码,从而提高执行效率。 3. **资源管理**:...
3. **验证安装**:通过执行`java -version`命令来检查JRockit是否已经成功安装。 ```bash java -version ``` 如果安装成功,将会显示JRockit的相关版本信息。 #### 四、常见问题及解决方法 在安装过程中可能...
2. **动态编译器**:JRockit包含了一种称为JRockit Mission Control的动态编译器,它可以实时地将热点代码编译为机器码,进一步提高执行速度。 3. **内存管理**:JRockit提供了精细的内存管理工具,帮助开发者定位...
《JRockit JDK 1.6.0_171:专为Windows x86_64平台优化的高性能Java运行环境》 JRockit JDK是Oracle公司开发的一款高性能、面向服务器端应用的Java虚拟机(JVM),特别针对英特尔处理器架构进行了深度优化,尤其在...
JRockit是一款由BEA Systems(后被Oracle收购)开发的Java虚拟机(JVM),它以其高性能和优化特性在Java开发者社区中享有盛誉。JRockit 3.1.0是该产品的一个特定版本,其许可证是用户在使用此软件时必须了解和遵守的...
JRockit Mission Control 是 BEA(现已被 Oracle 收购)推出的一款强大的 Java 应用性能管理和诊断工具,特别适用于检测和解决内存泄漏问题。这个工具集在 JRockit R26.0.0 及后续版本中捆绑提供,最新版本为 2.0.1...
JRockit 1.6是Oracle公司开发的一款高性能的Java虚拟机(JVM),它是针对服务器端应用优化的,尤其在大规模并发和低延迟场景下表现出色。此压缩包"jrockit1.6"包含了JRockit JDK的1.6版本,即JRockit Java ...