在Java的编译体系中,一个Java的源代码文件变成计算机可执行的机器指令的过程中,需要经过两段编译,第一段是把.java文件转换成.class文件。第二段编译是把.class转换成机器指令的过程。
在第二编译阶段,JVM通过解释字节码翻译成对应的机器指令,逐条读入,逐条解释翻译。经过解释执行,其执行速度必然会比可执行的二进制字节码慢很多,为了解决这个问题就引入了JIT技术(内存逃逸分析)技术。 引入了JIT之后,当JVM发现某个方法或代码块运行特别频繁的时候,就会认为是热点代码。然后JIT会把部分热点代码翻译成机器相关的机器码,并进行优化,然后再把翻译后的机器码缓存起来,以备下次使用。
逃逸分析的基本行为就是分析对象的动态作用域:当一个对象在方法中被定义后,它可能被外部方法所引用。就称为方法逃逸。
没有逃逸的对象会将堆分配转为栈分配。如果一个对象在子程序中被分配,要使指向该对象的指针永远不会逃逸,对象可能是栈内存的候选,而不是堆分配。