面试官:你知道对象逃逸是什么?什么情况下会产生?如何避免?

对象逃逸(Object Escape)是指在对象被创建后,其引用被传递到对象之外的作用域,使得对象在本应该被销毁的作用域外继续存在,从而导致对象的生命周期延长。对象逃逸可能会导致内存泄漏和影响程序性能。

一、产生对象逃逸的场景

  1. 将对象的引用传递给外部方法或类,使得对象在外部方法或类中继续存在。
  2. 将对象的引用保存到全局变量或静态变量中,使得对象的生命周期超出预期范围。
  3. 在多线程环境下,对象的引用被传递到其他线程,导致对象在其他线程中继续存在。

对象逃逸代码示例:

java
public class ObjectEscapeExample {

   private List<String> list;

   public ObjectEscapeExample() {
       this.list = new ArrayList<>();
       fetchData(list); // 对象逃逸,list引用传递到方法外部
   }

   private void fetchData(List<String> data) {
       data.add("Data 1");
       data.add("Data 2");
       // 这里本应该是方法结束,但由于list引用被传递到方法外部,对象逃逸了
   }

   public List<String> getList() {
       return list;
   }

   public static void main(String[] args) {
       ObjectEscapeExample example = new ObjectEscapeExample();
       List<String> dataList = example.getList();
       System.out.println(dataList); // 输出 ["Data 1", "Data 2"]
   }
}

在上面代码中, ObjectEscapeExample 类的构造函数中创建了一个 ArrayList 对象 list ,然后调用 fetchData 方法传递了 list 引用,导致 list 对象在方法外部继续存在,即发生了对象逃逸。通过 getList 方法可以获取到逃逸的 list 对象,并在 main 方法中可以输出了list的数据。

二、如何避免对象逃逸

  1. 限制对象的作用域,尽量在其被创建的作用域内使用并销毁对象。
  2. 避免将对象的引用传递到外部方法或类中,尽量在当前作用域内处理对象。
  3. 使用局部变量而不是全局变量或静态变量来保存对象引用,避免对象生命周期延长。
  4. 在多线程环境下,确保对象的引用不会被传递到其他线程中,可以使用线程封闭等技术来避免对象逃逸。

线程封闭是指:将对象的引用保存在线程本地变量中,或者使用ThreadLocal类等方式来确保对象只能被特定线程访问

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值