逃逸分析和栈上分配概念

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

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

方法逃逸的方式如下:

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好,也是为了提高性能。



作者:别拿爱情当饭吃
链接:https://www.jianshu.com/p/3ecc626ce304
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值