阅读《深入理解Java虚拟机》的过程中,会碰到一些不明就里的名词。虽然大概知道意思,但是如果一眼飘过去,估计过不了多久就会遗忘。这里单独提出来,去查阅资料,先形成自己的理解,再继续往下对比着看。
原文:但即使只考虑现在,由于即时编译技术的进步,尤其是逃逸分析技术的日渐强大,栈上分配、标量替换优化手段已经导致一些微妙的变化悄然发生,所以说Java对象实例都分配在堆上也渐渐变得不是那么绝对了。
————————————————————————————————
这里解释一下什么叫做逃逸分析、栈上分配以及标量替换。
简单说,即时编译器会对方法中的对象作用域进行分析,如果这个对象只是在该方法中使用,可以认为这个对象是没有逃逸出该方法的,当遇到这种情况时,JVM会针对这个对象做一些栈自动分配的事情。那么也就不需要占用堆内存也不需要被垃圾回收器管理,当栈帧压出(方法执行完返回了)该对象的内存会自动释放。
标量可以理解成一种不可分解的变量,如java内部的基本数据类型、引用类型等。 与之对应的聚合量是可以被拆解的,如对象。当通过逃逸分析一个对象只会作用于方法内部,虚拟机可以通过使用标量替换来进行优化。此时只需要在栈中使用标量来简化整个逻辑,甚至不需要创建这个对象的实例。
这些优化的手段,不仅可以减少运行时的堆内存消耗,也能够有效减少GC的次数,对于整体性能的提升是很显著的。
事实上,这个过程会很复杂,这里只是简单将概念讲清楚,避免阅读原文的过程被卡住。