Java对象在哪里存储?逃逸分析

1.Java对象的存储位置

堆是进程中最大的一块内存,主要用于存放新创建的对象(所有对象都在这里分配内存),方法区主要用于存放已被加载的类信息、常量、静态变量,即时编译后的代码等数据。

2.成员变量的一个基本数据类型有可能放在栈上吗

在Java中只要是成员变量,一旦所在类被实例化后,都是放在堆内存的,不管它是不是基本数据类型。
局部变量才是放在栈内存的。
局部变量表里面存放的是局部变量,存放方法参数和方法内部定义的局部变量。

3.什么是逃逸分析

基本原理:分析对象动态作用域,当一个对象在方法里面被定义,它可能被外部方法所引用,例如作为调用参数传递到其他方法中,这种称为方法逃逸;甚至还有可能被外部线程访问到,譬如赋值给可以在其他线程中访问的实例变量,这种称为线程逃逸;从不逃逸,方法逃逸到线程逃逸,称为对象由低到高的不同逃逸程度。
即:可以作为外部方法的调用参数称为方法逃逸
可以被外部线程访问称为线程逃逸

4.对象逃逸的优化

  1. 栈上分配:如果确定一个对象不会逃逸出线程之外,那让这个对象在栈上分配内存将会是不错的注意,对象所占用的空间就可以随栈帧出栈而销毁。在一般应用中,完全不会逃逸的局部对象和不会逃逸出线程的对象占比是很大的,如果使用栈上分配,那大量的对象就会随着方法的结束而自动销毁了,垃圾收集子系统的压力将会下降很多。栈上分配可以支持方法逃逸,但不能支持线程逃逸。
  2. 标量替换:如果把一个Java对象拆散,根据程序访问的情况,将其用到的成员变量恢复到原始类型来访问,这个过程就称为标量替换。
    假如逃逸分析能够证明一个对象不会被方法外部访问,并且这个对象可以被拆散,那么程序真正执行的时候将可能不去创建这个对象。而改为直接创建它的若干个被这个方法使用的成员变量来代替。
    标量替换可以视作栈上分配的一种特例,实现更简单,但对逃逸程度的要求更高。它不允许对象逃逸出方法范围内。
  3. 同步消除:线程同步本身是一个相对耗时的过程,如果逃逸分析能够确定一个变量不会逃逸出线程,无法被其他线程范围,那么这个变量的读写肯定就不会有竞争,对这个变量实施的同步措施也就可以完全地消除掉。

注意:逃逸分析技术还不成熟,因为逃逸分析的计算成本非常高,甚至不能保证逃逸分析带来的性能收益会高于他的消耗。
目前实验阶段设计了新的inline关键字用于定义Java的内联类型,有了这个标识与约束,逃逸分析要简单的多。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值