Java 中 JVM 怎么通过逃逸分析在底层将对象拆解为基本类型

梦萱同学_2682

梦萱同学_2682

2026-09-02

1017人浏览

原创

逃逸分析是jvm在jit编译阶段判断对象是否逃逸出方法或线程的静态+动态数据流分析,仅当对象完全不发生方法逃逸、线程逃逸和实例逃逸时,才标记为not escaping,进而触发标量替换——即彻底消除new指令,将字段平铺为栈帧或寄存器中的独立标量变量。

java 中 jvm 怎么通过逃逸分析在底层将对象拆解为基本类型

Java 中 JVM 并不是“把对象拆解为基本类型”这个动作本身,而是通过逃逸分析确认对象完全不逃逸后,由 JIT 编译器在生成本地代码时,直接跳过对象创建过程,只保留其字段作为独立的局部变量(标量),存入栈帧或 CPU 寄存器中。

逃逸分析是前提,不是优化动作

它不改变字节码,也不分配内存,只是在 JIT 编译阶段做的一次静态+动态数据流分析,回答一个问题:这个对象会不会被当前方法之外的代码访问?只有答案是“完全不会”,才可能触发后续优化。

  • 方法逃逸:对象被返回、传参给其他方法(包括 System.out.println、logger.info 等任意非 final 方法)
  • 线程逃逸:赋值给 static 字段、共享集合、或被其他线程可见的 this 字段
  • 实例逃逸:被存入 this 的可外部访问字段(比如 new A().field = obj)

三者全无,JVM 才标记该对象为 not escaping,进入下一步判断。

标量替换才是真正的“拆解”机制

所谓“拆解”,不是运行时把堆上对象切开,而是在编译期彻底消除 new 指令,把对象字段平铺为局部变量。例如:

Point p = new Point(1, 2); // record Point(int x, int y) { ... }
int sum = p.x + p.y;

JIT 可能编译为:

Java Maven Code Review
Java Maven Code Review

审查Java Maven项目(ZIP压缩包或GitLab仓库URL),检查代码规范、命名、模块边界、可维护性问题以及重复代码。

下载
  • 两个 int 局部变量:x = 1、y = 2
  • 直接计算:sum = x + y
  • 全程没有 Point 对象头、没有内存地址、无法反射、无法调用 getClass() 或 synchronized

如果字段本身也是简单对象(如内部含 final int z),且也未逃逸,JIT 还会递归拆解;但一旦遇到 String、List、Object[] 或任何不可静态判定的引用字段,整条链就中断。

包装类(Integer/Long)无法被拆解

即使写 Integer i = 42; 且 i 完全未逃逸,JVM 也不会把它变成栈上的 int。因为:

  • Integer 是真实类,有身份、哈希码、同步能力、可被 == 比较(涉及缓存逻辑)
  • HotSpot 明确禁止对 JDK 内置包装类做标量替换(安全与兼容性考虑)
  • 自动装箱本质仍是 new Integer(x),逃逸分析看到的是对象引用,不是数值语义

想让数值真正留在栈上,唯一可靠方式是:直接用 int、long 等基本类型声明和运算。

怎么确认它真的发生了

不能靠猜,得看 JVM 运行时输出:

  • 加参数:-XX:+UnlockDiagnosticVMOptions -XX:+PrintEscapeAnalysis -XX:+PrintEliminateAllocations
  • 关键日志:*** object is not escaping 和 *** scalar replaceable
  • 更硬核验证:-XX:+PrintOptoAssembly 查反汇编,确认没有 new Point 指令,只有寄存器直赋(如 mov %r11, 1)

GC 日志中同一逻辑的堆分配字节数下降,也是间接证据。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

java

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

9757

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

6902

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

6092

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1064

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

888

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1276

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2549

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

19891

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1155

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习