Java对象逃逸及逃逸分析

2023-10-27

1 Java对象在堆中分配内存是否绝对

  • Java中对象一般在堆中分配内存,但是存在特殊情况:如果经过逃逸分析之后发现,对象并没有逃逸出方法的话,就可能被优化成栈上分配内存
  • 优点:栈中分配内存,随着方法的执行结束,栈空间被自动移除,无须进行垃圾回收,减少了GC压力

2 逃逸分析

  • 分析对象的动态作用域
  • 当一个对象在方法中被定义后,只在方法内部使用,认为没有发生逃逸;当一个对象在方法中被定义后,被外部方法锁引用,认为发生逃逸。对于没有发生逃逸的对象,考虑栈上分配内存
//返回的是StringBuffer类型的对象,可能会被其他方法继续使用,发生逃逸
public stringBuffer append(String apple,String pear){
   StringBuffer buffer=new StringBuffer();
   buffer.append(apple);
   buffer.append(pear);
   return buffer;
}


// 返回的是字符串,对象值作用在方法内,随着方法执行的结束,对象就结束了,没有发生逃逸
public string append(String apple,String pear){
   StringBuffer buffer=new StringBuffer();
   buffer.append(apple);
   buffer.append(pear);
   return buffer.toString();
}

3 在逃逸分析时,编译器做了哪些优化?

  • 栈上分配:将堆分配转为栈分配,线程结束后,栈空间被回收,对象也会被回收,无须进行垃圾回收了

  • 同步省略:如果通过逃逸分析发现,同步代码块所使用的锁对象,只能够被一个线程访问而没有被发布到其他线程,那么JIT编译器在编译这个同步代码块的时候,会取消对这部分代码的同步(锁消除),极大提高并发性和性能

  • 标量替换:对象拆分成标量,存储在栈中

class User{
public int id;
public String name;
}

//标量替换:把u1对象拆成两个标量1和Tom存储在栈中
public void create(){
User u1 = new User;
u1.id = 1;
u1.name = "Tom";
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java对象逃逸及逃逸分析 的相关文章

  • 为什么 i++ 不是原子的?

    Why is i Java 中不是原子的 为了更深入地了解 Java 我尝试计算线程中循环的执行频率 所以我用了一个 private static int total 0 在主课中 我有两个线程 主题 1 打印System out prin
  • 在画布上绘图

    我正在编写一个 Android 应用程序 它可以在视图的 onDraw 事件上直接绘制到画布上 我正在绘制一些涉及单独绘制每个像素的东西 为此我使用类似的东西 for int x 0 x lt xMax x for int y 0 y lt
  • Play框架运行应用程序问题

    每当我尝试运行使用以下命令创建的新 Web 应用程序时 我都会收到以下错误Play http www playframework org Error occurred during initialization of VM Could no
  • Java JDBC:更改表

    我希望对此表进行以下修改 添加 状态列 varchar 20 日期列 时间戳 我不确定该怎么做 String createTable Create table aircraft aircraftNumber int airLineCompa
  • INSERT..RETURNING 在 JOOQ 中不起作用

    我有一个 MariaDB 数据库 我正在尝试在表中插入一行users 它有一个生成的id我想在插入后得到它 我见过this http www jooq org doc 3 8 manual sql building sql statemen
  • 无法展开 RemoteViews - 错误通知

    最近 我收到越来越多的用户收到 RemoteServiceException 错误的报告 我每次给出的堆栈跟踪如下 android app RemoteServiceException Bad notification posted fro
  • Spark 1.3.1 上的 Apache Phoenix(4.3.1 和 4.4.0-HBase-0.98)ClassNotFoundException

    我正在尝试通过 Spark 连接到 Phoenix 并且在通过 JDBC 驱动程序打开连接时不断收到以下异常 为简洁起见 下面是完整的堆栈跟踪 Caused by java lang ClassNotFoundException org a
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • 我可以使用 HSQLDB 进行 junit 测试克隆 mySQL 数据库吗

    我正在开发一个 spring webflow 项目 我想我可以使用 HSQLDB 而不是 mysql 进行 junit 测试吗 如何将我的 mysql 数据库克隆到 HSQLDB 如果您使用 spring 3 1 或更高版本 您可以使用 s
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • Java按日期升序对列表对象进行排序[重复]

    这个问题在这里已经有答案了 我想按一个参数对对象列表进行排序 其日期格式为 YYYY MM DD HH mm 按升序排列 我找不到正确的解决方案 在 python 中使用 lambda 很容易对其进行排序 但在 Java 中我遇到了问题 f
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • 为什么HashMap不能保证map的顺序随着时间的推移保持不变

    我在这里阅读有关 Hashmap 和 Hashtable 之间的区别 http javarevisited blogspot sg 2010 10 difference Between hashmap and html http javar
  • 总是使用 Final?

    我读过 将某些东西做成最终的 然后在循环中使用它会带来更好的性能 但这对一切都有好处吗 我有很多地方没有循环 但我将 Final 添加到局部变量中 它会使速度变慢还是仍然很好 还有一些地方我有一个全局变量final 例如android Pa
  • Eclipse Java 远程调试器通过 VPN 速度极慢

    我有时被迫离开办公室工作 这意味着我需要通过 VPN 进入我的实验室 我注意到在这种情况下使用 Eclipse 进行远程调试速度非常慢 速度慢到调试器需要 5 7 分钟才能连接到远程 jvm 连接后 每次单步执行断点 行可能需要 20 30
  • Java执行器服务线程池[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果我使用 Executor 框架在
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的
  • 当我从 Netbeans 创建 Derby 数据库时,它存储在哪里?

    当我从 netbeans 创建 Derby 数据库时 它存储在哪里 如何将它与项目的其余部分合并到一个文件夹中 右键单击Databases gt JavaDB in the Service查看并选择Properties This will
  • JGit 检查分支是否已签出

    我正在使用 JGit 开发一个项目 我设法删除了一个分支 但我还想检查该分支是否已签出 我发现了一个变量CheckoutCommand但它是私有的 private boolean isCheckoutIndex return startCo
  • 使用 xpath 和 vtd-xml 以字符串形式获取元素的子节点和文本

    这是我的 XML 的一部分

随机推荐

  • 基于Matlab的量子粒子群算法优化单目标问题

    基于Matlab的量子粒子群算法优化单目标问题 量子粒子群算法 Quantum Particle Swarm Optimization QPSO 是一种基于自然界粒子群群体智能算法的优化方法 QPSO算法通过引入量子力学的概念 将传统粒子群
  • Open AI 自监督学习笔记:Self-Supervised Learning

    转载自微信公众号 原文链接 https mp weixin qq com s biz Mzg4MjgxMjgyMg mid 2247486049 idx 1 sn 1d98375dcbb9d0d68e8733f2dd0a2d40 chksm
  • Python自动化测试框架:Pytest和Unittest的区别

    pytest和unittest是Python中常用的两种测试框架 它们都可以用来编写和执行测试用例 但两者在很多方面都有所不同 本文将从不同的角度来论述这些区别 以帮助大家更好地理解pytest和unittest 1 原理 pytest是基
  • spring缓存注解@Cacheable和@CacheEvict,设置过期时间和批量模糊删除

    spring缓存注解 Cacheable和 CacheEvict 设置过期时间和批量模糊删除 配置 CacheManager 类 key前缀配置 RedisCache配置 RedisCache 模糊匹配删除缓存 Cacheable Cach
  • html+css实现3D相册

  • 一文了解全球AIGC模型

    文章转自 首席数字官 ID ChiefDigitalOfficer 2022年9月6日 一幅由AI生成的画作 太空歌剧院 点燃了AIGC星星之火 ChatGPT的横空出世使AIGC浪潮以燎原之势席卷全球 AIGC开始融入数字化转型浪潮 并重
  • R绘制稀释曲线

    利用丰度表 抽平 绘制稀释曲线 TAO代码1 问题描述 问题1 计算 输出 diversity rarefaction 时报错 问题2 利用geom smooth拟合曲线时报错 原因分析及解决方案 问题1 在抽平时 需将depth设置成最大
  • .net 读配置信息并将配置信息绑定到一个对象上

    net 读配置信息并将配置信息绑定到一个对象上 假设我们的appsettings json配置文件是这样的 Logging LogLevel Default Information Microsoft Warning Microsoft H
  • 每天一个知识点-linux中获得进程号

    获取linux服务进程号 ps ef grep 服务名 grep v grep awk print 2 举个例子 root bd1 ps ef grep kk root 972997 692368 0 09 41 pts 4 00 00 0
  • mysql 字段增加备注_怎么在mysql数据库中添加备注信息

    怎么在mysql数据库中添加备注信息 发布时间 2021 02 20 16 04 19 来源 亿速云 阅读 56 作者 Leah 这期内容当中小编将会给大家带来有关怎么在mysql数据库中添加备注信息 文章内容丰富且以专业的角度为大家分析和
  • C语言sb代码,10个重要的算法C语言实现源代码

    拉格朗日 牛顿插值 高斯 龙贝格 牛顿迭代 牛顿 科特斯 雅克比 秦九昭 幂法 高斯塞德尔 一 拉格朗日插值多项式 include include include float lagrange float x float y float x
  • linux脚本判断192.168.1.0/24网络通不,shell脚本测试某网段内主机连通性

    1 测试192 168 4 0 24整个网段的连通性 while版本 bin bash Author 丁丁历险 Jacob 定义变量i控制循环次数 i从1开始循环 每循环一次 i自加1 直到i等于254循环退出 在每次循环中对一个IP进行p
  • Maven手动安装第三方jar报错问题解决

    由于目前构建项目 大多数会采用项目构建工具Maven来管理jar包 但是有时候某些第三方jar包并不在几个大型中央仓库之中 这就需要我们手动下载jar包 然后将jar安装到本地仓库或者私服 来项目中正常引用 首先下载jar包 安装之前最好打
  • 聪明的人脸识别2——Keras 利用Retinaface+Facenet搭建人脸识别平台

    聪明的人脸识别2 Keras 利用Retinaface Facenet搭建人脸识别平台 学习前言 什么是Retinface和Facenet 1 Retinface 2 Facenet 整体实现代码 实现流程 一 数据库的初始化 二 检测图片
  • eclipse修改默认工作空间

    如果勾选了Use this as the default and do not ask again下次要启动时不会再次显示修改工作空间的选择 要改变工作空间的方法 有3中方法可以更改workspace的路径设置 1 启动Eclipse My
  • opencv实现打开摄像头及视频文件

    完整人脸识别系统 源码 教程 环境 开源毕业设计 基于嵌入式ARM Linux的应用OpenCV和QT实现的人脸识别系统 源码 论文 完全毕设教程 Linux上Opencv与Qt实现的人脸识别的考勤点名 门禁系统 PC与嵌入式ARM版本 本
  • 从用户故事说起,谈谈怎么写TAPD的需求说明

    公司经常用 TAPD 来进行需求管理与敏捷迭代 那么针对 TAPD 上的第一步需求记录应该怎么写呢 本人就做了一个小小的总结与归纳 助力产品更加方便准确地完成需求的填写 什么是需求 需求 User Story 用户故事是从用户角度来描述用户
  • sqli-labs靶场15-19关通关笔记中总结

    第十五关 本关属于时间注入 基于源码分析 闭合字符是单引号 本关没有错误提示 那么我们只能靠猜测进行注入 这里我直接从源代码中看到了 sql语句 那这里对 id 进行 id 的处理 本关我们利用延时注入进行 uname admin and
  • 计算机网络练习题-3

    若主机H2向主机H4发送1个数据帧 主机H4向H2立即发送一个确认帧 则除H4外 从物理层上能够收到该确认帧的主机还有 D A 仅H2 B 仅H3 C 仅H1 H2 D 仅H2 H3 解析 关于物理层 数据链路层 网络层设备对于隔离冲突域的
  • Java对象逃逸及逃逸分析

    1 Java对象在堆中分配内存是否绝对 Java中对象一般在堆中分配内存 但是存在特殊情况 如果经过逃逸分析之后发现 对象并没有逃逸出方法的话 就可能被优化成栈上分配内存 优点 栈中分配内存 随着方法的执行结束 栈空间被自动移除 无须进行垃