java vm 小记 jit hotspot 解释执行

一. 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

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值