`

java vm 小记 jit hotspot 解释执行

    博客分类:
  • java
阅读更多

一. jvm 运行
The Java Virtual Machine (JVM) loads the class files and either interprets the bytecode or just-in-time compiles it to machine code and then possibly optimizes it using dynamic compilation.

以上内容引用自:http://en.wikipedia.org/wiki/Java_compiler

英文文档写的很好。这是我查了很久找到的最全面的jvm装载类执行的描述。

java虚拟机装载类文件后,通过解释执行字节码 或 即时编译成机器码 更有可能使用 自动优化编译。

以上内容有如下解释:
1.解释执行是最早期的执行方式,速度慢。

2.jit是传统的优化方式去加快代码执行

有文档描述IBM 使用 jit 进行运行时优化:http://www.ibm.com/developerworks/cn/linux/es-JITDiag.html

3.java hotspot vm 的自适应优化Adaptive optimization

sun 公司实现的 虚拟机命名 hotspot vm,sun 采用自动优化编译技术。



1.1 关于解释执行

public void getString(){ 
      String a ="a";
} 

//生成的java bytecode如下 
0x12 ldc 
  0x15 iload 
  0x4C astore_1 
  0xB1 return 

 
以上通过javac 生成的class中的 bytecode,java现有的bytecode 有202个。

详见:http://java.sun.com/docs/books/jvms/second_edition/html/Mnemonics.doc.html
java是解释型语言,即编译成中间语言bytecode,jvm运行时将bytecode解释成机器码执行。

1.2 使用 jit 的 jvm 如 ibm vm
每条语句都解释执行,能不能无需解释,第一次运行的时候编译?

于是有一些JVM实现者通过jit优化运行时速度

just in time 的定义:http://en.wikipedia.org/wiki/Just-in-time_compilation

 

JIT(just-in-time compilation,即时编译)指计算机领域里,即时编译也被称为动态翻译(dynamic translation),是一种通过在运行时将字节码翻译为机器码,从而改善字节码编译语言性能的技术。

just in time编译执行与解释执行的区别:

jit将整个getString方法编译,生成机器码,

解释执行执行getString时先解释ldc,执行对应机器码,再解释iload,执行对应机器码。于是,解释执行每次需要解释4次。

某confluence上jit compiler介绍http://www.javaworld.com.tw/confluence/display/JDictionary/JIT+Compiler



1.3 java hotspot vm

java hotspot vm 的自动优化技术在传统jit基础上有更多的优化方式:

请查阅hotspot 的overview:

http://java.sun.com/products/hotspot/whitepaper.html#3 


文档介绍了使用jit是一种优化执行
同时指出了,However, there are several issues with JIT compilation 使用jit会有一些难以解决的问题。

再次,Secondly, even if a JIT had time to perform full optimization,就算完全使用jit优化了,速度依旧没有c或c++速度快。

* Java语言是动态的安全,即确保不违反程序的语言的语义,或直接进入非结构化内存。这意味着动态型测试必须经常进行

* Java语言分配的所有对象的堆,而相比之下, C++中,许多是栈分配。这意味着,C++对象分配率要高得多。此外,由于Java语言是垃圾收集,它非常不同类型的内存分配间接费用。

*  Java语言中,大多数是虚拟方法调用(可能多态性) ,更经常使用比在C + + 。这不仅意味着该方法调用的性能更占主导地位,而且静态编译器优化是更加难以执行的方法调用。许多传统的优化是最有效的要求,以及减少之间的距离要求在Java语言,就可以大大降低其使用效能的最佳化,因为它们有小部分的代码工作。

* 基于Java技术的程序可以动态改变,动态加载的类。这使得困难得多。编译器必须不仅能够检测到这些优化成为无效,动态加载,但也可以撤消或重做这些优化程序的执行过程中,即使他们积极参与的方法对堆栈。这必须要在不损害或影响的基于 Java技术的程序执行语义以任何方式。


最后指出:

The Java HotSpot VM architecture addresses the Java language performance issues described above by using adaptive optimization technology.

在Java HotSpot虚拟机架构的Java语言解决性能问题上文所述利用自适应优化技术



1.4 java hotspot vm 特性

在hotspot文档中有详细介绍:

  • The Java HotSpot Compilers
  •  


    Hot spot Detection 热点检测

    往往程序大部分时间只是在执行一小段代码,于是无需将全部进行编译。

    hot spot vm解释运行代码,并分析是否是hot spot关键部分,如果是则进行global natvie code 优化。

    hot spot vm关注最关键的代码,避免汇编不常执行代码,而不必增加总汇编时间。

    hot spot vm持续动态监测的程序运行。

    程序运行一次后,可以对相关信息进行收集,执行更更智能优化。

     

     

    方法内嵌method inlining

    虚拟方法调用是java编程语言的一个重要优化瓶颈。

    it not only compiles the hot spot into native code, but also performs extensive method inlining on that code.

    vm不仅仅编译成本地代码,而且把方法内嵌到调用的代码里。

     

    内嵌有重要的作用。它极大地降低了动态频率的方法调用,从而节省所需的时间来执行这些方法调用。更重要的是,内嵌的代码可以执行优化工作。这就造成了一种局面,大大增加了传统的编译器效率的优化,克服的主要障碍增加了Java编程语言的性能。

    内嵌是协同其他代码优化,因为这使它们更有效。正如在Java HotSpot编译器的成熟,在未来,内置模块的代码将有更先进的优化技术。

     

     

    动态优化

    java语言特性,使得热点检测,方法内嵌变的相当复杂,如动态方法调用,重新装载类文件。

    所以vm所优化的代码必须跟着代码变化而动态变化。

    java hotspot client compiler 和 java hotspot server compiler就是执行动态优化的。

     


    java hotspot client compiler

    客户端分三个阶段编译代码,

     

    第一步:a platform-independent front end  constructs a high-level intermediate representation (HIR)from the bytecodes

    第二步:In the second phase, the platform-specific back end generates a low-level intermediate representation (LIR) from the HIR.

    第三步:The final phase performs register allocation on the LIR using a customized version of the linear scan algorithm, does peephole optimization on the LIR and generates machine code from it.


    java hotspot server compiler

    server compiler对应是优化服务器应用的。

    有大量的优化技术,包括including dead code elimination, loop invariant hoisting, common subexpression elimination, constant propagation, global value numbering, and global code motion

     

     

     

    2
    0
    分享到:
    评论

    相关推荐

      java-jdk-hotspot源码

      甚至这个虚拟机最初并非是为Java语言而开发的,它来源于Strongtalk VM, 而这款虚拟机中相当多的技术又是来源于一款支持Self语言实现“达到C语言50%以上的执行效率”的目标而设计的虚拟机, Sun公司注意到了这款...

      The Java HotSpot VM.pdf

      HotSpot虚拟机通过其创新的JIT技术,使用了分层编译策略(TieredCompilation),它结合了解释执行和编译执行的优点,以适应不同程序的运行阶段和热点代码的需求。 2. **分层编译(TieredCompilation)**:该策略将...

      Java虚拟机解释执行机制研究.pdf

      为了提高执行效率,现代的JVM如HotSpot采用了一种即解释执行又即时编译(JIT)的技术。在程序运行初期,JVM先解释执行字节码,同时通过性能监控收集热点信息。当发现某段代码被频繁执行时,JIT编译器将这段代码编译...

      08-java11-hotspot-guide.pdf

      1. 即时编译器:HotSpot虚拟机包含两个主要的JIT编译器,即Client Compiler(C1)和Server Compiler(C2),它们分别优化了不同类型的Java应用程序的性能。C1更倾向于编译速度,适用于短小快速运行的应用程序;C2则...

      JavaVM运作原理

      1. **类加载器(ClassLoader)**:负责读取Java类文件(.class),将它们转换为可执行的字节码。 2. **内存空间(Memory Space)**: - **方法区(Method Area)**:存储每个类的信息、静态变量等。 - **Java栈(Java Stack...

      hllvm.JIT编译以及执行native code的流程1

      在HotSpot中,`call_helper`函数是调用Java方法的通用入口点,无论是解释执行还是编译执行。 - `call_helper`函数首先检查方法是否已经JIT编译。如果尚未编译,`CompilationPolicy::must_be_compiled`会判断是否...

      Java虚拟机(Java VM) msjavax86 微软java虚拟机

      Java虚拟机(Java Virtual Machine,简称JVM)是Java编程语言的核心组成部分,它是一个用于执行Java字节码的软件或硬件设备。Java程序在编译时并不直接转化为机器语言,而是转化为中间代码,即字节码。JVM的作用就是...

      hllvm.01.JIT编译以及执行native code的流程1

      1. 方法调用阶段:在这个阶段,Java方法调用会经过JavaCalls::call_helper()函数,执行解释执行或编译执行的入口。 2. native代码执行阶段:在这个阶段,native代码会被执行,执行结果会被存储在result_val_address...

      hotspot.tar.gz

      1. 解释器:Hotspot VM最初使用解释器来执行字节码,这是一种快速启动但执行速度相对较慢的方式。 2. 编译器:随着程序的运行,Hotspot VM会识别出执行频率高的“热点”代码,并使用Just-In-Time (JIT) 编译器将其...

      用于查看Hotspot的JIT的汇编码 hsdis

      Hotspot虚拟机采用Just-In-Time (JIT) 编译技术,能够将Java字节码动态编译为本地机器代码,以提升程序执行效率。为了更好地理解和分析JIT编译器的工作过程,开发者需要有一种方式来查看编译后的汇编代码。hsdis,...

      Java VM 规范

      解释器将字节码逐条解释执行,JIT则将热点代码编译成本地机器码以提高性能。 4. **内存管理**:包括垃圾收集机制,用于自动回收不再使用的对象所占用的内存。Java的垃圾收集算法有多种,如标记-清除、复制、标记-...

      jdk1.8 下载。 hotspot (包含源码)

      HotSpot包括一个即时编译器(JIT),它能够在运行时将频繁执行的字节码转化为机器码,从而提升程序的运行速度。JDK 1.8的HotSpot可能包含了优化的JIT编译策略和垃圾回收算法,例如G1垃圾收集器,它在大内存应用中...

      Compilation in the HotSpot VM-Zoltan-Majo.pdf

      Compilation in the HotSpot VM 是一篇关于 Java 虚拟机(Java Virtual Machine,JVM)的技术文档, 由 Oracle 公司的 HotSpot 编译器团队的 Zoltán Majó 撰写。该文档详细介绍了 HotSpot JVM 中的编译过程,包括...

      hsdis工具,hotspot虚拟机插件,反汇编jit编译代码

      HotSpot虚拟机采用解释器和JIT编译器的混合执行模式。解释器会首先执行字节码,然后根据执行频率和复杂性选择将热点代码编译为本地机器码,这就是所谓的“热点探测”和“即时编译”。这种策略能够在不牺牲启动速度的...

      Java VM Specification

      - **执行**:解释器解释执行字节码指令,或通过JIT编译器将其转换为机器码执行。 #### 六、JVM的内存模型 - **堆**:所有线程共享的内存区域,存放对象实例。 - **栈**:每个线程私有的内存区域,用于存储局部变量...

      hotspot-8.rar

      HotSpot是Java平台的重要组成部分,它负责解释执行Java字节码并进行动态编译,以提高程序的运行效率。 【描述】中提到的"hotspot8官网源码",意味着这个压缩包包含了HotSpot虚拟机8版本的源代码。对于Java开发者来...

      java虚拟机

      8. **编译与即时编译(JIT,Just-In-Time)**:JVM有两种方式执行代码,解释执行和编译执行。即时编译器将频繁执行的热点代码编译成本地机器码,以提高运行速度。 9. **类文件结构**:.class文件包含了类的版本、...

      Java虚拟机解释执行机制研究.zip

      不过,解释执行的效率相对较低,为了提升性能,现代JVM如HotSpot采用了即时编译(JIT,Just-In-Time Compilation)技术,将频繁执行的热点代码编译成本地机器码,实现更高的执行速度。 内存管理是JVM的另一大核心...

      java和JIT编译器版本.pdf

      JIT编译器是Java虚拟机(JVM)的一部分,它能够在程序运行时将字节码转换为机器码,从而提高执行效率。了解JIT编译器的不同版本对于优化Java应用程序的性能至关重要。 在Java中,JIT编译器有两个主要类型:Client和...

      java的JIT 工作原理简单介绍

      最新的JVM实现,如GraalVM,引入了更先进的JIT技术,如即时编译的子集(Substrate VM),它甚至可以在运行时编译整个应用程序,创建一个静态链接的可执行文件,进一步提升启动速度和运行时性能。 总的来说,Java的...

    Global site tag (gtag.js) - Google Analytics