做个笔记,参开其他资料学习一下,以下纯属个人见解,如有错误之处,欢迎讨论和纠正。
参考资料
JVM的逃逸分析
深入分析JVM逃逸分析对性能的影响
对象并不一定都是在堆上分配内存的
在思考一个问题,在Java
中,所有的对象都是分配在堆上吗?
在jvm规范
中,所有的对象都是分配上堆上面的。jvm规范
是这么规定的,但是随着JIT
编译技术的发展,具体的jvm
实现存在一定的差异,会进行一定的优化。其中,就有通过“逃逸分析”技术,Java Hotspot
编译器能够分析出一个新的对象的引用的使用范围从而决定是否要将这个对象分配到堆上。
在一些资料中,看到有这样的理解。
-
因为Java本身的限制(对象只能分配到堆中),为了减少临时对象在堆内分配的数量,在一个方法体内定义一个局部变量,并且该变量在方法执行过程中未发生逃逸,按照JVM调优机制,首先会在堆内存创建类的实例,然后将此对象的引用压入调用栈,继续执行,这是JVM优化前的方式。
-
采用逃逸分析对JVM进行优化。即针对栈的重新分配方式,首先找出未逃逸的变量,将该变量直接存到栈里,无需进入堆,分配完成后,继续调用栈内执行,最后线程执行结束,栈空间被回收,局部变量也被回收了。如此操作,是优化前在堆中,优化后在栈中,从而减少了堆中对象的分配和销毁,从而优化性能。
上面几篇都讲的挺好的,这里就不多说啦。
网友评论