Java逃逸与逃逸分析总结

发布时间:2026/9/11 9:57:14

Java逃逸与逃逸分析总结 Java逃逸与逃逸分析1. 什么是“逃逸”1.1 概念“逃逸”是指一个对象被分配后其引用被传递到了创建它的方法或线程之外导致外部可以访问到它。根据逃逸的范围主要分为三种情况不逃逸 (NoEscape)对象只在方法内部使用不会被外部访问。这是最理想的状态可以进行深度优化。方法逃逸 (MethodEscape)对象作为方法参数传递或被作为返回值返回。例如return sb; 就可能导致对象逃逸到调用方。线程逃逸 (ThreadEscape)对象被赋值给类变量或实例变量可能被其他线程访问。例如public static GlobalEscape instance new GlobalEscape(); 就发生了全局线程逃逸。1.2 代码示例发生逃逸无法优化publicstaticStringBuffercreateStringBuffer(Strings1,Strings2){StringBuffersbnewStringBuffer();// 对象在方法内创建sb.append(s1);sb.append(s2);returnsb;// 对象被返回发生了方法逃逸[reference:24]}未发生逃逸可优化publicstaticStringcreateString(Strings1,Strings2){StringBuffersbnewStringBuffer();// 对象在方法内创建sb.append(s1);sb.append(s2);returnsb.toString();// 返回的是Stringsb本身没有逃逸[reference:25]}2. 逃逸分析2.1 概念逃逸分析是 JIT 编译器JVM 的即时编译器如 C2在运行时做的一项静态分析目的是判断一个对象是否会逃逸出当前方法或线程。JVM 在 Java 6 引入Java 7 开始默认开启-XX:DoEscapeAnalysis。基于逃逸分析的结果JVM会进行以下几种主要优化目标是减轻GC垃圾回收压力提升程序性能。栈上分配 (Stack Allocation)通常Java对象在堆上分配。如果分析确认对象不会逃逸出方法JIT编译器会尝试将其分配在栈上。好处对象随方法调用结束自动销毁无需GC介入效率极高。标量替换 (Scalar Replacement)这是一种更激进的优化。如果对象不逃逸JIT在编译时可能不创建完整对象而是将其字段拆解替换为多个独立的局部变量标量来使用。好处无需在堆上分配内存进一步减少GC压力。同步锁消除 (Lock Elimination)对于被synchronized同步块保护的对象如果分析确认该对象不会发生线程逃逸即只被一个线程访问JIT会消除这个同步锁。好处避免不必要的锁竞争开销提升单线程下的执行效率。2.2 代码示例标量替换Scalar Replacement把对象拆散成多个基本类型变量彻底消灭对象分配// 原代码PointpnewPoint(1,2);intsump.xp.y;// JIT 优化后相当于intpx1,py2;intsumpxpy;// 根本没有对象被创建锁消除Lock Elision如果一个加了 synchronized 的对象不逃逸不可能被多线程共享JIT 会直接删掉这把锁避免无意义的加锁开销。voidfoo(){StringBuffersbnewStringBuffer();// 不逃逸sb.append(a);// synchronized 方法但锁会被消除sb.append(b);}2.3 小结粒度从小到大不逃逸 → 方法逃逸 → 线程逃逸。只有不逃逸的对象才能享受全部优化。3.使用与配置3.1 相关参数开启/关闭逃逸分析在 JDK 6u23及以后版本默认开启。强制开启-XX:DoEscapeAnalysis 强制关闭-XX:-DoEscapeAnalysis相关参数-XX:EliminateLocks开启锁消除默认开启 -XX:EliminateAllocations开启标量替换默认开启3.2 具体配置方式直接启动命令行java-XX:DoEscapeAnalysis-jaryour-app.jarIDEA 开发环境Run/Debug Configurations → VM options 里填-XX:-DoEscapeAnalysisMaven / Gradle 测试时!--maven-surefire-plugin--configurationargLine-XX:-DoEscapeAnalysis/argLine/configurationTomcat / 应用服务器在 catalina.sh 或 catalina.bat 里配置 JAVA_OPTSJAVA_OPTS-XX:DoEscapeAnalysis -XX:EliminateLocksSpring Boot 打包运行java-XX:DoEscapeAnalysis-jarspring-boot-app.jar3.3 逃逸分析参数与GC参数对比通俗的描述GC相关参数像是环卫部门的管理制度多久扫一次地垃圾丢哪个桶。逃逸分析参数像是生产部门的工艺改进制造产品时尽量少产生包装废料从源头减量。逃逸分析让对象尽量不产生在堆里比如放在栈上自动销毁从而帮GC减轻了负担但配置的主体依然是JIT编译器而不是GC回收器本身。4. 结语依赖JIT逃逸分析是运行时由JIT编译器完成的依赖其实现质量。分析成本逃逸分析本身有一定性能开销并非所有代码都能从中获益。并非万能它只是一个分析工具最终优化效果取决于JVM的具体实现并非所有“不逃逸”的对象都能被成功优化。总的来说逃逸分析是JVM一项重要的幕后优化技术开发者常规情下无需手动干预而了解其原理有助于写出对JVM更友好的代码。
延伸阅读

更多相关文章

2026/9/11 3:06:34

信息技术设备CCC认证详解:产品范围界定与技术标准解读

一、CCC认证制度概述 CCC认证(China Compulsory Certification,中国强制性产品认证)是中国政府为保护国家安全、人身健康和安全、环境保护等目的而实施的强制性产品合格评定制度。信息技术设备(ITE,Information Techn…

2026/8/31 14:39:22

【信息科学与工程学】信息科学领域——第一百三十五篇 射频/天线16 射频计算(WiFi CSI + 5G-A/6G空间感知)​ 与向量数据库、规则引擎(含法律规则库+招投标围标串标+利益输送

射频计算(WiFi CSI + 5G-A/6G空间感知)​ 与向量数据库、规则引擎(含法律规则库+招投标围标串标+利益输送/利益交换/利益勾结库)、图神经网络、知识图谱、NLP大语言模型、图论/集合论/离散数学/组合数学等多领域算法的深度融合,用于招投标围标串标、利益输送、利益交换、利…

2026/8/31 8:20:14

【法律领域】【信息科学与工程学】计算机科学与自动化——第二百二十四篇 规则引擎 系列一 招投标围标串标和利益链识别02

招投标围标串标分层利益链识别规则引擎(续:A-61 起 强化学习、联邦学习与国际规则) 聚焦 强化学习自适应阈值、跨区域联邦学习协同、国际招投标与GPA规则、区块链智能合约自动执行​ 四个前沿方向。本轮规则旨在提升规则引擎的自适应能力、跨区域协作效率、国际化合规水平以…

2026/9/12 3:14:39

光伏充电站V2G技术优化与动态电价策略

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/12 3:14:39

2026项目管理软件测评:10款工具选型指南与避坑建议

选项目管理软件这事,我算是把市面上叫得上名字的工具几乎都折腾过一轮。之前团队从几个人扩张到上百人,中间换过三次工具,每一次切换都伴随着数据迁移的折腾、成员习惯的重建以及各种“早知道当初就选对”的后悔。所以当有人问我“2026年了&a…

2026/9/12 3:14:39

日期时间数据处理全攻略:从Excel到SQL再到Pandas

做数据分析这些年,我越来越觉得“日期时间数据”是个被严重低估的数据类型。很多人做数据分析项目时,一开始关注的是销售额、用户量、转化率这些指标数字,却忽略了背后真正撑起分析框架的时间字段。等到做同环比、留存、漏斗、生命周期分析的…

2026/9/12 3:09:39

尼帕病毒:特征、检测与防控策略

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/12 2:05:33

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/10 11:16:38

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/9 16:31:09

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/12 0:04:17

MATLAB仿生优化框架:长鼻浣熊算法多策略融合实现

简介:本资源是一份面向智能优化算法研究者与MATLAB初学者的仿生智能算法实践代码包,聚焦于长鼻浣熊优化算法(COA)的多策略改进与性能验证。针对传统COA易陷局部最优、收敛精度不足等问题,作者融合Circle映射初始化提升…

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 JavaWeb 的校园一卡通管理系统的设计与实现 基于 JavaWeb 的校园卡业务管理系统(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 Java 的图书馆借阅管理平台的搭建与实现 基于 Java 的图书馆综合管理系统(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/10 12:32:02

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/10 15:19:50

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/10 15:49:53

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码