java road

JVM-编译-学习笔记

2018-06-29  本文已影响30人  HardWJJ

JAVA编译

将java源代码编译成机器指令经过以下步骤(根据完成任务不同,可以将编译器的组成部分划分为前端与后端)


QQ20180414-203816.png

前端编译(词法分析、语法分析、语义分析与中间代码生成)

.java文件编译成.class的编译过程,主要指与源语言有关但与目标机无关的部分。

后端编译(代码优化和目标代码生成等)

JVM 通过解释字节码将其翻译成对应的机器指令,逐条读入,逐条解释翻译。但执行速度必然会比可执行的二进制字节码程序慢很多,为了解决这种效率问题,引入了 JIT 技术。
当JVM发现某个方法或代码块运行特别频繁的时候,就会认为这是“热点代码”。然后JIT会把部分“热点代码”翻译成本地机器相关的机器码,并进行优化,然后再把翻译后的机器码缓存起来,以备下次使用。

JIT编译器

JIT 是 just in time 的缩写, 也就是即时编译编译器。使用即时编译器技术,能够加速 Java 程序的执行速度。

JIT编译过程

自适应的即时编译和运行时优化

分层编译

Hot Spot 编译

初级调优:客户模式或服务器模式

中级编译器调优

高级编译器调优

当一个方法拥有编译资格时,它就会排队并等待编译。这个队列是由一个或很多个后台线程组成。编译是一个异步的过程。并且这些队列并不会严格的遵守先进先出原则:哪一个方法的调用计数器计数更高,哪一个就拥有优先权,这种优先权顺序保证最重要的代码被优先编译。

逃逸分析

随着JIT编译期的发展与逃逸分析技术逐渐成熟,栈上分配、标量替换优化技术将会导致一些微妙的变化,所有的对象都分配到堆上也渐渐变得不那么“绝对”了。--《深入理解Java虚拟机中》

public static StringBuffer craeteStringBuffer(String s1, String s2) {
    StringBuffer sb = new StringBuffer();
    sb.append(s1);
    sb.append(s2);
    return sb;
}

参考

上一篇下一篇

猜你喜欢

热点阅读