美文网首页
JIT编译器,逃逸分析

JIT编译器,逃逸分析

作者: salix_ | 来源:发表于2020-04-10 09:11 被阅读0次

对象一定分配在内存上吗?看完逃逸分析就可以知道了,当然你得先知道JIT编译器。

一:JIT编译器

JIT 是 just in time 的缩写, 也就是即时编译编译器。使用即时编译器技术,能够加速 Java 程序的执行速度。 我们都知道javac 将程序源代码编译,转换成 java 字节码,JVM 通过解释字节码将其翻译成对应的机器指令,逐条读入,逐条解释翻译。很显然,经过解释执行,其执行速度必然会比可执行的二进制字节码程序慢很多。为了提高执行速度,引入了 JIT 技术。
在运行时 JIT 会把翻译过的机器码保存起来,以备下次使用,因此从理论上来说,采用该 JIT 技术可以接近以前纯编译技术。

当 JVM 执行代码时,它并不立即开始编译代码。
以前的时候,java 需要将字节码逐条翻译成对应的机器指令并且执行,这就是传统的 JVM 的解释器的功能,正是由于解释器逐条翻译并执行这个过程的效率低(因为可能编译了重复的代码),引入了 JIT 即时编译技术。
首先,如果这段代码本身在将来只会被执行一次,那么从本质上看,编译并且保存就是在浪费精力、空间。
当然,如果一段代码频繁的调用方法,或是一个循环,也就是这段代码被多次执行,那么编译就非常值得了。因此,编译器具有的这种权衡能力会首先执行解释后的代码,然后再去分辨哪些方法会被频繁调用来保证其本身的编译。其实说简单点,就是 JIT 在起作用,我们知道,对于 Java 代码,刚开始都是被编译器编译成字节码文件,然后字节码文件会被交由 JVM 解释执行,所以可以说 Java 本身是一种半编译半解释执行的语言。Hot Spot VM 采用了 JIT compile 技术,将运行频率很高的字节码直接编译为机器指令执行以提高性能,所以当字节码被 JIT 编译为机器码的时候,要说它是编译执行的也可以。也就是说,运行时,部分代码可能由 JIT 翻译为目标机器指令(以 method 为翻译单位,还会保存起来,第二次执行就不用翻译了)直接执行。
第二个原因是最优化,当 JVM 执行某一方法或遍历循环的次数越多,就会更加了解代码结构,那么 JVM 在编译代码的时候就做出相应的优化。

放个网上的图

二:逃逸分析

只是说一下个人的浅显理解
我们已经知道了JIT编译器做了很多优化,其中一个优化就是逃逸分析。如果一个对象被分析出来一定逃不出这个这个方法,那就把堆分配转换成栈分配。下面的例子中,第一个可以逃出(返回了这个变量的引用),第二个不可以逃出(返回了对象的toString)。

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

相关文章

  • JIT编译器,逃逸分析

    对象一定分配在内存上吗?看完逃逸分析就可以知道了,当然你得先知道JIT编译器。 一:JIT编译器 JIT 是 ju...

  • JIT(just-in-time) 即时编译

    JIT 简介 JIT 是 just in time 的缩写, 也就是即时编译编译器。使用即时编译器技术,能够加速 ...

  • 深入浅出 JIT 编译器

    JIT 简介 JIT 是 just in time 的缩写, 也就是即时编译编译器。使用即时编译器技术,能够加速 ...

  • golang 逃逸分析_v1.0.0

    逃逸分析是golang编译器分析一个对象到底应该放到堆内存上,还是栈内存上逃逸是指在某个方法之内创建的对象,除了在...

  • 逃逸分析

    From - 自由编程 所谓逃逸分析(Escape analysis),是指由编译器进行内存分配策略分析, 通过编...

  • 聊一聊go的内存逃逸分析

    什么是内存逃逸分析 内存逃逸分析是go的编译器在编译期间,根据变量的类型和作用域,确定变量是堆上还是栈上 简单说就...

  • 关于Java的JIT知识整理

    什么是JIT: JIT编译器(just in time 即时编译器),当虚拟机发现某个方法或代码块运行特别频繁时,...

  • GO内存逃逸是什么

    一、我们说内存逃逸时在说什么 问,内存逃逸是干什么的答,内存逃逸分析是编译器在编译优化时,用来决定变量应该分配在堆...

  • 什么是JIT?怎么优化?

    什么是JIT JIT 是 just in time 的缩写, 也就是即时编译编译器。 在运行时 JIT 会把翻译过...

  • 全网最屌——java性能优化——编译器版本与平台对应关系

    JIT编译器版本 JIT编译器有不同的版本,而最终你使用哪种,取决于你所使用的系统平台。前面的文章我们说到编译器有...

网友评论

      本文标题:JIT编译器,逃逸分析

      本文链接:https://www.haomeiwen.com/subject/bgrlmhtx.html