对象一定分配在堆中吗?聊聊TLAB和逃逸分析技术

news/2025/1/17 6:08:38/文章来源:https://www.cnblogs.com/seven97-top/p/18516719

TLAB

TLAB是虚拟机在堆内存的eden划分出来的一块专用空间,是线程专属的。在虚拟机的TLAB功能启动的情况下,在线程初始化时,虚拟机会为每个线程分配一块TLAB空间(包含在 Eden 空间内),只给当前线程使用,这样每个线程都单独拥有一个空间,如果需要分配内存,就在自己的空间上分配,这样就不存在竞争的情况,可以大大提升分配效率。

多线程同时分配内存时,使用 TLAB 可以避免一系列的非线程安全问题,同时还能提升内存分配的吞吐量,因此我们可以将这种内存分配方式称为快速分配策略

为什么要有 TLAB :

  • 堆区是线程共享的,任何线程都可以访问到堆区中的共享数据

  • 由于对象实例的创建在 JVM 中非常频繁,因此在并发环境下从堆区中划分内存空间是线程不安全的

  • 为避免多个线程操作同一地址,需要使用加锁等机制,进而影响分配速度

当然了,不是所有的对象实例都能够在 TLAB 中成功分配内存,但 JVM 确实是将 TLAB 作为内存分配的首选。

在程序中,可以通过 -XX:UseTLAB 设置是否开启 TLAB 空间。

默认情况下,TLAB 空间的内存非常小,仅占有整个 Eden 空间的 1%,可以通过 -XX:TLABWasteTargetPercent 设置 TLAB 空间所占用 Eden 空间的百分比大小。

一旦对象在 TLAB 空间分配内存失败时,JVM 就会尝试着通过使用加锁机制确保数据操作的原子性,从而直接在 Eden 空间中分配内存

逃逸分析技术

对象一定分配在堆中吗?

不一定的,JVM通过「逃逸分析」,那些逃不出方法的对象就会在栈上分配。

栈上分配的条件

  • 作用域不会逃逸出方法的对象

  • 小对象(一般几十个byte);大对象无法在栈上分配

  • 标量替换:若逃逸分析证明一个对象不会逃逸出方法,不会被外部访问,并且这个对象是可以被分解的,那程序在真正执行的时候可能不创建这个对象,而是直接创建这个对象分解后的标量来代替。这样就无需在对对象分配空间了,只在栈上为分解出的变量分配内存即可。

什么是逃逸分析

逃逸分析(Escape Analysis),是一种可以有效减少Java 程序中同步负载和内存堆分配压力的跨函数全局数据流分析算法。

通过逃逸分析,Java Hotspot编译器能够分析出一个新的对象的引用的使用范围,从而决定是否要将这个对象分配到堆上。

  • 一个对象在方法中被定义后,对象如果只在方法内部使用,则认为没有发生逃逸;(没有发生逃逸的对象,会在栈上分配)

  • 当一个对象在方法中被定义后,它被外部方法所引用,则认为发生了逃逸。

如何快速的判断是否发生了逃逸分析?

  • 看new的对象实体是否有可能在方法外被调用。注意是看new 出来的实体,而不是那个引用变量。

通俗点讲,如果一个对象的指针被多个方法或者线程引用时,那么我们就称这个对象的指针发生了逃逸。

逃逸分析的好处

  • 栈上分配,可以降低垃圾收集器运行的频率。

  • 同步消除,如果发现某个对象只能从一个线程可访问,那么在这个对象上的操作不需要同步。

  • 标量替换,把对象分解成一个个基本类型,并且内存分配不再是分配在堆上,而是分配在栈上。这样的好处有

    • 减少内存使用,因为不用生成对象头。

    • 程序内存回收效率高,并且GC频率也会减少。

小结

关于逃逸分析的论文在1999年就已经发表了,但直到JDK 1.6才有实现,而且这项技术到如今也并不是十分成熟的。

其根本原因就是无法保证逃逸分析的性能消耗一定能高于他的消耗。虽然经过逃逸分析可以做标量替换、栈上分配、和锁消除。但是逃逸分析自身也是需要进行一系列复杂的分析的,这其实也是一个相对耗时的过程。

一个极端的例子,就是经过逃逸分析之后,发现没有一个对象是不逃逸的。那这个逃逸分析的过程就白白浪费掉了。

面试题专栏

Java面试题专栏已上线,欢迎访问。

  • 如果你不知道简历怎么写,简历项目不知道怎么包装;
  • 如果简历中有些内容你不知道该不该写上去;
  • 如果有些综合性问题你不知道怎么答;

那么可以私信我,我会尽我所能帮助你。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/824472.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Metasploit Pro 4.22.5-2024102801 发布下载,新增功能简介

Metasploit Pro 4.22.5-2024102801 发布下载,新增功能简介Metasploit Pro 4.22.5-2024102801 发布下载,新增功能简介 Metasploit Pro 4.22.5-2024102801 (Linux, Windows) - 专业渗透测试框架 2024 年 10 月 28 日,版本 4.22.5-2024102801 请访问原文链接:Metasploit Pro 4…

Qt/C++地图导航app/支持qml/手机运行/输入起点终点规划路径/模拟轨迹移动

一、前言说明 搞Qt地图开发这块,随着研究的深入,用户的需求变化,最近又需要在手机上运行,由于本地图组件依赖浏览器控件,而手机安卓上的Qt并没有带qwebengine控件,怎么办呢,不断的努力验证下,发现Qt安卓上提供了webview控件可以加载网页,而webview在安卓上只能用qml,…

别再忽视!PostgreSQL Public 模式的风险以及安全迁移

别再忽视!PostgreSQL Public 模式的风险以及安全迁移作者:桦仔 10余年DBA工作经验 微信:debolop QQ交流群:740052625 公众号:数据库实战派问题起因 前几天有群友在群里面咨询PG12,13,14,public模式是否可以删除或改名?因为这位群友的公司的PG规范做了修改,不让使用…

读数据湖仓09读后总结与感想兼导读

读后总结与感想兼导读1. 基本信息 数据湖仓[美]比尔恩门(BillInmon);[美]戴夫拉皮恩(DaveRapien);[美]瓦莱丽特(ValerieBartelt)著人民邮电出版社2024年7月出版1.1. 读薄率 书籍总字数???千字,笔记总字数23238字。 读薄率23238???000≈??% 1.2. 读厚方向构建可…

library官网登录入口,zlibrary中文网及客户端/app

Z-Library是一个全球知名的在线数字图书馆和文件共享网站,以下是它的详细介绍:藏书量丰富:Z-Library拥有超过9,826,996本电子书和84,837,646篇学术期刊文章,覆盖了从经典文学到前沿理工学科,从人文艺术到专业学术论文的广泛领域。 多种格式支持:Z-Library支持多种电子书格…

视频恶劣天气消除的扩散测试时间适应性

实践中的真知灼见:视频恶劣天气消除的扩散测试时间适应性现实世界中的视觉任务经常受到意外恶劣天气条件的影响,包括雨、霾、雪和雨滴。在过去的十年里,卷积神经网络和视觉变换器在单天气视频去除方面取得了突出成果。然而,由于缺乏适当的适应,它们中的大多数无法推广到其…

​【图吧杂谈】谈玄武电源短信轰炸开盒事件

​【图吧杂谈】谈玄武电源短信轰炸开盒事件 老铁们,我图吧老捡垃圾的了,今天谈谈如何评价在群里讨论玄武电源被开盒+短信轰炸? 事情是这样的,之前垃圾佬不是搁群里刷到了玄武代工厂3C认证显示抽检不合格的事吗,这事最近迎来了高潮,也带我们真正走近了这家赛博朋克企业看清…

chapter7

scheduler.py参数中文版第一题问题使用 SJF 和 FIFO 调度程序运行长度为 200 的 3 个作业时,计算响应时间和周转时间。第二题问题现在做同样的事情,但有不同长度的作业,即 100、200 和 300。第三题问题现在做同样的事情,但采用 RR 调度程序,时间片为 1。 输出太长了,不截…

MyBatis-Plus:简化 CRUD 操作的艺术

MyBatis-Plus 是一个基于 MyBatis 的增强工具,它旨在简化 MyBatis 的使用,提高开发效率。一、关于MyBatis-Plus 1.1 简介 MyBatis-Plus 是一个基于 MyBatis 的增强工具,它旨在简化 MyBatis 的使用,提高开发效率。 ​ ‍ ‍ ‍ ​ ‍ 关于Mybatis 简介 MyBatis 是一款流行的…

Redis持久化机制与位图api

持久化机制 将我们的内存数据 通过数据持久化写入磁盘中实现持化、 Redis官方提供了两种不同的持久化方法来将内存的数据存储到硬盘里面分别是:RDB持久化,快照(Snapshot)【默认】 AOF (Append Only File) 只追加日志文件【默认不开启】1.快照(snapshot)(关机慢开机快) redis…

js基础必看系列--2024-10-30总结

好的书写习惯最好不要省略分号,尤其对新手来说 确保 “use strict” 出现在最顶部"use strict"; 代码以现代模式工作【ES5 规范增加了新的语言特性并且修改了一些已经存在的特性。为了保证旧的功能能够使用,大部分的修改是默认不生效的。你需要一个特殊的指令 ——…

数据结构 - 散列表,三探之代码实现

本文介绍散列表代码实现,使用取模方式构建散列函数,实现链式法和开放寻址法(线性探测)解决碰撞,包含初始化、插入、删除、查找等功能,并实现了再散列方法,代码已上传至代码库。书接上回,我们继续来聊散列表的代码实现。相信通过前面两章对散列表的学习,大家应该已经掌…