`

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公司注意到了这款...

      JAVA虚拟机精讲

      HotSpot VM 是目前市面上高性能JVM 的代表作之一,它采用解释器+JIT 编译器的混合执行引擎,使得Java 程序的执行性能从此有了质的飞跃。《Java虚拟机精讲》以极其精练的语句诠释了HotSpot VM 的方方面面,比如:字节...

      jitwatch:Java HotSpot JIT编译器的日志分析器可视化工具。 检查内联决策,热门方法,字节码和汇编。 在JavaFX用户界面中查看结果

      HotSpot JIT编译器的日志分析器和可视化工具。 JITWatch 视频介绍 我在JITWatch 上的LJC闪电演讲中的 有关说明和屏幕截图,请参见Wiki。 JITWatch用户界面是使用JavaFX构建的。 这包含在Oracle JDK中。 如果您...

      Java虚拟机精讲.高翔龙.带书签完整版.pdf

      HotSpot VM 是目前市面上高性能JVM 的代表作之一,它采用解释器+JIT 编译器的混合执行引擎,使得Java 程序的执行性能从此有了质的飞跃。本书以极其精练的语句诠释了HotSpot VM 的方方面面,比如:字节码的编译原理、...

      JIT-Java高级程序设计试卷A.doc

      JIT----Java高级程序设计试卷A.doc JIT----Java高级程序设计试卷A.doc JIT----Java高级程序设计试卷A.doc JIT----Java高级程序设计试卷A.doc JIT----Java高级程序设计试卷A.doc JIT----Java高级程序设计试卷A.doc ...

      JAVA虚拟机精讲 pdf

      HotSpot VM 是目前市面上高性能JVM 的代表作之一,它采用解释器+JIT 编译器的混合执行引擎,使得Java 程序的执行性能从此有了质的飞跃。本书以极其精练的语句诠释了HotSpot VM 的方方面面,比如:字节码的编译原理、...

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

      1、您介绍了执行引擎是如何选择解释执行和编译执行的入口,以及JIT模式下如何安装已编译好的native代码 2、你提到当使用-Xcomp启动VM的时候会在cal

      实战JAVA虚拟机 JVM故障诊断与性能优化

      带标签的,java虚拟机中比较好的一本书,值得阅读与收藏

      HotSpot实战高清版本

      Cache、Perf Data、Crash 分析方法、转储分析方法、 垃圾收集器的设计演进、CMS 和 G1 收集器、栈、JVM 对硬件寄存器的利用、栈顶缓存技术、解释器、字节 码表、转发表、Stubs、Code Cache、Code 生成器、JIT 编译器...

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

      1、您介绍了执行引擎是如何选择解释执行和编译执行的入口,以及JIT模式下如何安装已编译好的native代码 2、你提到当使用-Xcomp启动VM的时候会在cal

      java的JIT 工作原理简单介绍

      主要介绍了java的JIT 工作原理简单介绍的相关资料,需要的朋友可以参考下

      java虚拟机精讲(电子工业出版社出版)

      HotSpot VM是目前市面上高性能JVM的代表作之一,它采用解释器+JIT 编译器的混合执行引擎,使得Java 程序的执行性能从此有了质的飞跃。本书以极其精练的语句诠释了 HotSpot VM的方方面面,比如:字节码的编译原理、...

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

      其中包含以下文件:hsdis-amd64.dll、hsdis-i386.dll、linux-hsdis-amd6、linux-hsdis-i386。用于查看Hotspot的JIT的汇编码。

      GraalVM最佳实践,使用Java开发.rar

      到目前为止,GraalVM提供了两种运行Java程序的方法:将Java HotSpot VM与GraalVM JIT(即时)编译器一起使用,以及第二种方法:使用GraalVM Native Image编译为本机可执行文件。 今天,我们很高兴地宣布一种在...

      java和JIT编译器版本.pdf

      ——学习参考资料:仅用于个人学习使用! 本代码仅作学习交流,切勿用于商业用途,否则后果自负。若涉及侵权,请联系,会尽快处理! 未进行详尽测试,请自行调试!

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

      编译好的dll文件,hotspot虚拟机插件,反汇编jit编译代码

      HotSpot实战

      包括OpenJDK与HotSpot项目、编译和调试HotSpot的方法、HotSpot内核结构、Launcher、OOP-Klass对象表示系统、链接、运行时数据区、方法区、常量池和常量池Cache、Perf Data、Crash分析方法、转储分析方法、垃圾收集器...

      Java-Study Java 基础 学习 参考文章.rar

      HotSpot 采用了惰性评估(Lazy Evaluation)的做法,根据二八定律,消耗大部分系统资源的只有那一小部分的代码(热点代码),而这也就是 JIT 所需要编译的部分。JVM 会根据代码每次被执行的情况收集信息并相应地做出...

    Global site tag (gtag.js) - Google Analytics