美文网首页
逃逸分析和栈上分配

逃逸分析和栈上分配

作者: 别拿爱情当饭吃 | 来源:发表于2018-04-26 11:15 被阅读778次

了解逃逸分析栈上分配之前,我们可以先简单了解一下它们的基本定义。

逃逸分析(个人理解):就是方法内的对象,可以被方法外所访问。

方法逃逸的方式如下:

public class EscapeTest {

public static Object obj;

public void globalVariableEscape() {

// 给全局变量赋值,发生逃逸

obj = new Object(); }

public Object methodEscape() {

// 方法返回值,发生逃逸

return new Object(); }

public void instanceEscape() {

// 实例引用发生逃逸 test(this); }

}

来自:深入分析jvm逃逸分析对性能的影响

栈上分配:就是把没发生逃逸的对象,在栈分配空间。(一般对象分配空间是在堆)逃逸

二者联系:jvm根据对象是否发生逃逸,会分配到不同(堆或栈)的存储空间。

如果对象发生逃逸,那会分配到堆中。(因为对象发生了逃逸,就代表这个对象可以被外部访问,换句话说,就是可以共享,能共享数据的,无非就是堆或方法区,这里就是堆。)

如果对象没发生逃逸,那会分配到栈中。(因为对象没发生逃逸,那就代表这个对象不能被外部访问,换句话说,就是不可共享,这里就是栈。)

那我们再想深一层,为什么会有逃逸分析,有栈上分配这些东西?

当然是为了主体的考虑,主体就是jvm,或者直接说为了GC考虑也不为过。大家想想,GC主要回收的对象是堆和方法区。GC不会对栈、程序计数器这些进行回收的,因为没东西可以回收。

说回来,如果方法逃逸,那么对象就会分配在堆中,这个时候,GC就要工作了。如果没发生方法逃逸,那么对象就分配在栈中,当方法结束后,资源就自动释放了,GC压根不用操心。所以哈,方法逃逸这东西,主要也是为GC打工的,或者说为GC服务吧!说到这里,可能有人会问,那方法逃逸和性能还是没关系哈?emmm!!!其实有,想深一层,GC不运行的时候,程序的性能肯定会好点,不会占用程序运行的时间。虽然GC清扫垃圾的速度很快,但是当一个程序足够大的时候,对象就自然多了,垃圾也自然多了,这个时候GC就忙了。

巴拉巴拉这么多,主要就是想说:能在方法内创建对象,就不要再方法外创建对象。毕竟这是为了GC好,也是为了提高性能。

Ps:这是小编的小总结,各位技术大佬勿喷,但是欢迎纠错指正,小编愿闻其详。同时也希望把一些知识传播、分享给更多的人。


相关文章

  • go 逃逸分析

    go 逃逸分析 什么是逃逸分析 逃逸分析决定一个变量是分配在堆上还是分配在栈上 原理 逃逸分析这种“骚操作”把变量...

  • 栈上分配和方法逃逸

    栈上分配和逃逸分析 栈上分配指的是根据方法的运行过程,建立java的虚拟机栈,这个方法栈帧根据方法的运行顺序入栈和...

  • 逃逸分析和栈上分配

    了解逃逸分析和栈上分配之前,我们可以先简单了解一下它们的基本定义。 逃逸分析(个人理解):就是方法内的对象,可以被...

  • 逃逸分析和栈上分配

    Java实例的内存是分配在堆区域当中的,而栈区域当中只保存了引用,当实例不再使用的时候则进行垃圾回收。程序运行的时...

  • 栈上分配(逃逸分析)

    栈上分配(逃逸分析) 分析 ​ 逃逸分析的基本行为就是分析对象动态作用域:当一个对象在方法中被定义后,它可以能...

  • JVM的逃逸分析

    对象一定分配在堆中吗? JVM通过逃逸分析,那些逃不出方法的对象会在栈上分配。 什么是逃逸分析? EscapeAn...

  • java对象分配过程

    1.编译器通过逃逸分析判断对象是在栈上分配还是堆上分配,如果是堆上分配则进入下一步。(开启逃逸分析需要设置jvm参...

  • golang的变量内存分配

    逃逸分析 逃逸分析不是直接的优化手段,而是一个代码分析,通过动态分析对象的作用域,为其它优化手段如栈上分配、标量替...

  • JVM 之逃逸分析

    逃逸分析 逃逸分析并不是直接的优化手段,而是一个代码分析,通过动态分析对象的作用域,为其它优化手段如栈上分配、标量...

  • JVM 对象分配过程

    对象分配过程 1)依据逃逸分析,判断是否能栈上分配? 如果可以,使用标量替换方式,把对象分配到VM Stack中。...

网友评论

      本文标题:逃逸分析和栈上分配

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