技术前沿 JVM for Linux JIT诊断技术简介

开发 后端
你对JVM for Linux JIT 诊断技术是否熟悉,这里简要介绍Just-In-Time(JIT)编译器和Mixed ModeInterpreter(MMI)优化技术,在IBM的JVM1.3.1和1.4.2中使用了这两种技术。

JVM有很多值得学习的地方,本文简要介绍Just-In-Time(JIT)编译器和Mixed ModeInterpreter(MMI)优化技术,在IBM的JVM1.3.1和1.4.2中使用了这两种技术,它们对于从SunHotspotJVM上迁移过来的Java程序可能产生影响。

JVM for Linux JIT 诊断技术简介

“一次编写,到处运行”(WORA)的原则只有在将纯Java™的字节码从一个平台的某个特定版本的Java虚拟机(JVM)移植到另外一个不同平台上完全相同版本的JVM上时才适用。

然而,有时这种迁移过程并不是无缝的。可以对这个迁移过程产生影响的一个因素是不同供应商的优化技术的内部实现之间存在差异。

在将一个Java程序从使用SunJDK的平台迁移到使用IBMJDK的平台上时,重要的是要了解在这两个供应商的JVM中使用的优化技术之间的差异,这些差异可能会对程序产生影响,以及如何通过调节IBM JVM中可用的优化机制来获得更好的性能。

本文着重介绍对于在JVM for Linux JIT中碰到的问题的诊断,在从SunHotSpotJVM迁移到IBM基于JVM for Linux JIT的JVM时可能会碰到这些问题。

虽然本文中介绍的大部分内容对于IBMJVM1.3.1和1.4.2都是普遍适用的,但是尤其适用于IBMJVM1.3.1和JVM1.4.2forLinux,包括POWER和PowerPC架构上的Linux。

在Sun的JVM1.3.1中,JIT和HotSpot编译器都已经包含其中了,可以使用-server或-hotspot选项(默认为客户机HotSpotVM)来调用,使用-classic选项调用JIT,-hotspot选项是隐含的默认值。在SunJDK1.4.1及之后的版本中,只能使用HotSpot了。IBMJVM1.3.1和1.4.2使用了JIT和MMI的组合,这是默认的运行模式,可以实现与HotSpot相同的功能。#p#

JVM for Linux JIT和MMI

用来提高Java程序性能的工具是Just-In-Time(JIT)编译器。JVM for Linux JIT是一个代码生成器,它将Java字节码转换成宿主平台的本地代码。Java程序使用JIT调用时的运行速度通常都比使用解释程序执行字节码时的速度更快。

当JVM启动时,会有很多方法被加载到JVM中并执行。

如果JIT被禁用了,那么JVM启动会很快,但是在大部分情况中,运行程序的速度都会与解释字节码的速度一样慢。如果JIT被启用了,但是并没有使用JIT的一些自适应式优化机制,就会试图在启动时对所有方法进行编译。对于诸如applet之类的小程序来说,当启动JVM的时间长于运行程序的时间时,就可能会成为问题。

IBM JVMMixedModeInterpreter(MMI)与JIT紧密地结合在一起,它可以减轻这个问题。它可以用于与HotSpotVM相同的目的,将编译方法延伸到JVM的生命期之外。除了其他特性之外,MMI还可以计算一个特定的方法被执行了多少次。为了达到平衡的性能,MMI对于IBMJVM支持的每种平台都有一个默认的上限计数器,这是经过仔细选择的,并经过了广泛的测试和研究。

每执行一次方法,该方法在MMI中的上限计数器就减1。当一个方法的上限计数器达到零(0)时,就可以使用JIT将这个方法编译成本地代码了。因此,与HotSpotVM一样,高频率使用的方法——“热点”——都会在启动JVM之后由JIT进行编译,而低频度使用的方法则会在之后进行编译,或者可能在整个JVM进程的生命周期中都不会被编译。

IBM JVM1.3.1和1.4.2还为改进某些Java程序的启动时间而提供了一个非标准的选项-Xquickstart。-Xquickstart选项会导致使用优化选项的子集来运行JIT;也就是说,快速编译的方法。这个选项适用于短期运行的程序,特别是那些执行时间不集中在少量的“热点”方法中的程序。如果-Xquickstart选项用在长时间运行的程序上,而这些程序又包含一些热点方法,那么这个选项就可能会导致性能的降低。

与其他非标准的-X选项一样,-Xquickstart选项的实现和存在都可能不加通知就会修改。

可以减小MMI上限计数器,从而加速JIT编译一个方法的过程;或者增大它以达到相反的效果。这是通过使用一个环境变量IBM_MIXED_MODE_THRESHOLD实现的,与其他环境变量一样,需要在运行JVM进程的shell实例中进行设置。自然,这个变量是在启动JVM进程之前设置的,对于在JVM中执行的所有方法都是有效的。

将IBM_MIXED_MODE_THRESHOLD设置为0可以禁用MMI,这样,所有的方法在***加载到JVM中时就可以立即使用JIT进行编译。#p#

IBM JVM运行时模式如下:

◆MMI和JIT都启用

这是默认的IBMJVM设置。

◆MMI禁用,JIT启用

所有的方法都是在***运行之前编译的,即JVM的启动时间可能会很慢,但是后来的性能会很好。

◆MMI和JIT都禁用

JVM是一个纯解释系统。所有的代码都不会进行编译。禁用JVM for Linux JIT同时还会自动禁用MMI,并将IBM_MIXED_MODE_THRESHOLD设置为0,这样可以有效地禁用MMI,但是不会禁用JIT。

MMI是一个非常有效的解释器,利用宿主平台上的程序集代码来达到***的优化。虽然JIT并不是JVM的一个集成部分,但却以一个共享库(libjitc)的形式提供了,它与MMI紧密地结合在一起,JVM for Linux JIT和MMI是IBMJVM中紧密结合的两种技术。

在JavaHotSpotVM或经典的JIT模式中使用的是SunJVM1.3.1,Sun的JIT实现并不与IBM的JIT完全相同;SunHotSpotJVM1.4.1中根本没有JIT。当将Java程序从SunJVM1.3.1或SunJVM1.4.1迁移到IBMJVM上时,在一些非常罕见的情况中可能会出现问题,问题的范围从性能的下降,到代码会产生不正确的结果,以及JVM的挂起、崩溃和出现一些异常。

【编辑推荐】

  1. 巧解IBM JVM for Linux onPOWER性能调优
  2. JVM for Linux JIT诊断技术简介
  3. 揭露MyEclipse JVM内存不足的内幕
  4. 专家指导 如何进行JVM参数配置
  5. 巧解IBM JVM for Linux onPOWER性能调优

 

 

责任编辑:佚名 来源: ibm.com
相关推荐

2010-09-27 10:11:54

JVMLinux

2010-09-27 14:20:00

JITJVM

2010-08-09 09:09:43

Flex技术

2010-06-30 16:52:23

UML数据建模

2014-08-08 15:36:39

Apdex

2010-07-29 09:08:20

Flex客户端缓存

2010-08-10 13:04:27

FlexBuilder

2010-07-30 15:35:11

Flex结合

2010-08-10 15:55:20

FlexHTML页面

2010-07-29 17:26:54

Flex富客户端技术

2010-08-09 12:59:15

Flex4beta

2010-08-06 14:58:42

FlexAIR

2021-03-21 23:04:45

5G6G网络

2010-09-08 14:09:35

切换CSS

2010-09-26 14:01:10

JVM Log

2010-08-04 16:24:08

FlexSDK4

2010-08-10 15:38:32

Flex2.0

2022-06-28 09:01:26

RSSFeedlyCommafeed

2010-08-11 12:50:04

Flex4

2010-08-17 14:15:30

DIV+CSS布局
点赞
收藏

51CTO技术栈公众号