你了解 Java 的逃逸分析吗?
Java 的逃逸分析
1. 定义
逃逸分析(Escape Analysis)是 JVM 的一种优化技术,用于分析对象的作用域,从而决定对象的分配方式或优化手段。
主要目的是判断一个对象是否会逃离当前方法或线程的作用域。
2. 逃逸分析的类型
2.1 方法逃逸
如果对象被方法外的代码引用,则该对象发生方法逃逸。
示例:
public class EscapeExample {
private Object obj;
public void methodEscape() {
obj = new Object(); // 对象逃逸到当前方法外
}
}
2.2 线程逃逸
如果对象被当前线程以外的代码引用,则该对象发生线程逃逸。
示例:
public void threadEscape() {
new Thread(() -> {
System.out.println(new Object()); // 对象逃逸到其他线程
}).start();
}
3. 逃逸分析的优化方式
3.1 栈上分配
如果一个对象没有发生逃逸,则可以将该对象分配在栈上而不是堆上。
优点:
- 减少堆内存分配,降低垃圾回收(GC)的压力。
示例:
public void stackAllocation() {
Object obj = new Object(); // 不逃逸,分配在栈上
System.out.println(obj);
}
3.2 标量替换
- 如果对象没有逃逸,JVM 可以将对象拆解为基本数据类型或成员变量,避免创建完整的对象。
- 示例:
public void scalarReplacement() {
Point point = new Point(1, 2); // 不需要创建完整的 Point 对象
int x = point.x; // JVM 可以只分配 x 和 y
int y = point.y;
}
3.3 同步消除
- 如果某个对象没有线程逃逸,则 JVM 可以优化掉其上的同步块。
- 示例:
public void synchronizationElimination() {
Object lock = new Object(); // 没有线程逃逸
synchronized (lock) {
System.out.println("No thread escape!");
}
}
4. 逃逸分析的局限性
- 复杂代码场景:对于复杂的代码路径,逃逸分析可能无法精确判断对象的作用域。
- JVM 实现依赖:逃逸分析是特定 JVM(如 HotSpot)中的优化特性,不同 JVM 的实现可能有所不同。
- 对性能的影响:逃逸分析虽然能优化性能,但其计算本身也需要消耗资源。
5. 如何启用逃逸分析
在 HotSpot JVM 中,可以通过以下 JVM 参数启用逃逸分析(默认开启):
-XX:+DoEscapeAnalysis
- 禁用逃逸分析:
-XX:-DoEscapeAnalysis
- 查看逃逸分析优化的效果(如标量替换和同步消除):
-XX:+PrintGCDetails -XX:+PrintCompilation
6. 逃逸分析的示例
以下是一个演示逃逸分析优化的代码示例:
public class EscapeAnalysisTest {
public static void main(String[] args) {
long start = System.currentTimeMillis();
for (int i = 0; i < 1_000_000_000; i++) {
allocate();
}
long end = System.currentTimeMillis();
System.out.println("Execution Time: " + (end - start) + " ms");
}
private static void allocate() {
Point point = new Point(1, 2); // 对象未逃逸,可分配在栈上
}
}
class Point {
int x, y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
7. 总结
- 逃逸分析 是一种静态分析技术,用于判断对象是否逃离当前方法或线程的作用域。
- 主要优化:
- 栈上分配:减少堆分配和 GC 压力。
- 标量替换:避免创建完整对象。
- 同步消除:优化掉不必要的同步块。
- 启用方式:通过 -XX:+DoEscapeAnalysis 启用。
- 注意事项:逃逸分析的效果依赖于 JVM 的实现,可能对复杂代码场景表现有限。
你了解 Java 的逃逸分析吗?的更多相关文章
- 深入理解Java中的逃逸分析
在Java的编译体系中,一个Java的源代码文件变成计算机可执行的机器指令的过程中,需要经过两段编译,第一段是把.java文件转换成.class文件.第二段编译是把.class转换成机器指令的过程. ...
- Java之JVM逃逸分析
引言: 逃逸分析(Escape Analysis)是众多JVM技术中的一个使用不多的技术点,本文将通过一个实例来分析其使用场景. 概念 逃逸分析,是一种可以有效减少Java 程序中同步负载和内存堆分配 ...
- java中的逃逸分析
逃逸分析 public static StringBuffer craeteStringBuffer(String s1, String s2) { StringBuffer sb = new Str ...
- 面试问我 Java 逃逸分析,瞬间被秒杀了。。
记得几年前有一次栈长去面试,问到了这么一个问题: Java中的对象都是在堆中分配吗?说明为什么! 当时我被问得一脸蒙逼,瞬间被秒杀得体无完肤,当时我压根就不知道他在考什么知识点,难道对象不是在堆中分配 ...
- Java逃逸分析
Java逃逸分析 记录下看到的别人的博客内容,以后深入了解再详细写篇,加深下基础概念和印象! 一般来说,Java对象的创建,通常是在堆空间中分配内存,但是如果大量的临时对象也在堆空间创建的话,会导致性 ...
- [转]Java 逃逸分析
作者:栈长 公众号:Java技术栈 记得几年前有一次栈长去面试,问到了这么一个问题:Java中的对象都是在堆中分配吗?说明为什么! 当时我被问得一脸蒙逼,瞬间被秒杀得体无完肤,当时我压根就不知道他在 ...
- 面试官:Java中对象都存放在堆中吗?你知道逃逸分析?
面试官:Java虚拟机的内存分为哪几个区域? 我(微笑着):程序计数器.虚拟机栈.本地方法栈.堆.方法区 面试官:对象一般存放在哪个区域? 我:堆. 面试官:对象都存放在堆中吗? 我:是的. 面试官: ...
- java虚拟机的逃逸分析
逃逸分析作为其他优化手段提供依据的分析技术,其基本行为就是分析对象动态作用域:当一个对象在方法中被定义后,它可能被外部方法所引用,例如作为调用参数传递到其他方法中,称为方法逃逸.甚至还有可能被外部线程 ...
- JVM中启用逃逸分析
-XX:+DoEscapeAnalysis 逃逸分析优化JVM原理我们知道java对象是在堆里分配的,在调用栈中,只保存了对象的指针.当对象不再使用后,需要依靠GC来遍历引用树并回收内存,如果对象数量 ...
- JVM笔记-逃逸分析
参考: http://www.iteye.com/topic/473355http://blog.sina.com.cn/s/blog_4b6047bc01000avq.html 什么是逃逸分析(Es ...
随机推荐
- 小程序之confirm-type改变键盘右下角的内容和input按钮详解
confirm-type的介绍 confirm-type 在什么时候使用呢? 如果说搜索框的时候,当用户输入完了之后,我们就需要 将confirm-type="search"的值设 ...
- .NET周刊【1月第2期 2025-01-12】
国内文章 [.NET] API网关选择:YARP还是Ocelot? https://www.cnblogs.com/madtom/p/18655530 本文详细比较了YARP和Ocelot两种API网 ...
- Kali Linux 简介
Kali Linux 简介 Kali Linux 是一个由 Offensive Security 公司开发.维护和资助的基于 Debian 的 Linux 发行版,专为高级渗透测试和安全审计而设计.它 ...
- RocketMQ实战—9.营销系统代码初版
大纲 1.基于条件和画像筛选用户的业务分析和实现 2.全量用户促销活动数据模型分析以及创建操作 3.Producer和Consumer的工程代码实现 4.基于抽象工厂模式的消息推送实现 5.全量用户促 ...
- 我们是如何解决abp身上的几个痛点
大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的垫脚石,让我们一起精进. abp框架在.net社区是spring一样的存在,用的人也非常多,毫无疑问,它确实 ...
- Blazor开发框架KnownPro-创建新项目
摘要 本文主要介绍如何使用Known专业版创建新项目. 操作步骤 登录Known专业版VIP会员管理系统. 进入首页,点击[创建项目]按钮. 弹出创建项目对话框,填写项目ID.名称和数据库类型(默认S ...
- 动手学深度学习-python基础知识介绍(数据处理基础流程)part2
数据预处理 import os os.makedirs(os.path.join('..','data'),exist_ok=True) data_file=os.path.join('..','da ...
- 使用Visual Studio 调式NDK so 库时,调试工具无法显示vector内容
最近在研究C++开发安卓端so库,demo使用xamarin.android作为载体来验证算法库文件的准确性.调试过程中发现vector中的内容无法显示集合详细.如下图 研究了半天(参考链接2.3), ...
- Ansible - [01] 入门&安装部署
自动化运维工具,可以批量远程其他主机并进行管理操作 一.什么是 Ansible Ansible首次发布于2012年,作者:Michael DeHaan,同时也是Cobbler的作者,Ansible于2 ...
- halcon中是怎么实现半导体/Led中的GoldenDie的检测方法的 基于局部可变形模板匹配 variation_model模型
原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/18739196 这篇简单介绍一下halcon中的print_check_single_chars ...