当前位置: 首页 > article >正文

JVM方法逃逸

根据对象逃逸的范围,可以分为方法逃逸和线程逃逸。

当对象被方法外部的代码引用,生命周期超出了方法的范围,那么对象就必须分配在堆中,由垃圾收集器管理。

public Person createPerson() {
    return new Person(); // 对象逃逸出方法
}

比如说 new Person() 创建的对象被返回,那么这个对象就逃逸出当前方法了。

再比如说,对象被另外一个线程引用,生命周期超出了当前线程,那么对象就必须分配在堆中,并且线程之间需要同步。

public void threadEscapeExample() {
    Person p = new Person(); // 对象逃逸到另一个线程
    new Thread(() -> {
        System.out.println(p);
    }).start();
}

对象 new Person() 被另外一个线程引用了,发生了线程逃逸。

逃逸分析会有哪些好处呢?

主要有三个。

第一,如果确定一个对象不会逃逸,那么就可以考虑栈上分配,对象占用的内存随着栈帧出栈后销毁,这样一来,垃圾收集的压力就降低很多。

第二,线程同步需要加锁,加锁就要占用系统资源,如果逃逸分析能够确定一个对象不会逃逸出线程,那么这个对象就不用加锁,从而减少线程同步的开销。

第三,如果对象的字段在方法中独立使用,JVM 可以将对象分解为标量变量,避免对象分配。

public void scalarReplacementExample() {
    Point p = new Point(1, 2);
    System.out.println(p.getX() + p.getY());
}

如果 Point 对象未逃逸,JVM 可以优化为:

int x = 1;
int y = 2;
System.out.println(x + y);


http://www.kler.cn/a/602016.html

相关文章:

  • 鸿蒙北向源码开发: xts用例单部件编译并执行测试用例
  • 树莓派ollama docker报错尝试网上方法
  • 构建一个解释器的完整过程:以C语言为核心的技术探索
  • Ymodem调试笔记
  • 线下媒体邀约
  • 在 Ubuntu 20.04 上重新启动网络
  • air780eq 阿里云
  • 《网络安全等级测评报告模版(2025版)》
  • Qt高分屏自适应
  • tensorboard报错MessageToJson() got an unexpected keyword argument
  • ElementUI dropdown触发显示时阻止事件冒泡
  • 蓝桥杯第十届 数列求值
  • 【vue】warning:Avoid mutating a prop directly
  • AI Agent 是什么?从 Chatbot 到自动化 Agent(LangChain、AutoGPT、BabyAGI)
  • 如何创建一个socket服务器?
  • OpenAI流式解析
  • 计算机网络入门:物理层与数据链路层详解
  • HTTP 核心知识点整理
  • 云端陷阱:当免费午餐变成付费订阅,智能家居用户如何破局?
  • Idea中诡异的文件编码问题: 设置fileCodeing为UTF8但不生效