JVM对象内存布局

2023-11-13

HotSpot虚拟机中,对象在内存中的存储布局分3部分:对象头,实例数据,对齐填充。

一.     对象头

对象头包含两部分信息:对象的运行时数据和类型指针。

1.    对象的运行时数据

对象的运行时数据非常多,主要有哈希码,GC分代年龄,锁状态标志,线程持有的锁,偏向线程ID,偏向时间戳等。

①   哈希码:对象的标识。

②   GC分代年龄:GC即Java的垃圾回收机制。Java堆分两部分:新生代堆和老年代堆。对应地,GC也分为Minor GC和Full GC。Minor GC负责扫描新生代堆,Full GC负责扫描老年代堆。GC扫描时,若发现对象死亡,则回收;其他生存对象则年龄+1。当新生代堆对象年龄到达某个值时(GC分代年龄),就可以进入老年代堆。老年代堆则无年龄限制。绝大多数的对象都会在新生代堆中死亡,所以进入老年代堆中的对象往往是可能要长期存活的对象,因此Full GC的扫描并不会像Minor GC那样频繁。

③   锁状态标识:Java中锁的是对象,不是代码。锁状态有4种:无锁,偏向锁,轻量级锁,重量级锁。

其中,线程当前对象不访问任何同步代码时,对象是无锁的;偏向锁是一段同步代码被单线程访问时使用的,代价低;偏向锁的代码被第二个线程访问时,偏向锁就会升级为轻量级锁,此时若其他线程也要访问,则通过自旋(即循环请求)的方式进行尝试,不会阻塞;当其他线程的自旋进行到一定次数,依然无法访问时,该线程就会阻塞,锁由轻量级锁升级为重量级锁。重量级锁会令所有后续请求的线程阻塞。

2.    类型指针

类型指针指向元数据,虚拟机通过该指针确定该对象是哪个类的实例。然而,并非所有虚拟机都要在对象头中保存该指针。

二.     实例数据

实例数据是对象存储的有效信息,即程序中定义的各个字段。包含从父类继承的信息。各个字段的存储顺序会受到JVM分配策略与字段在Java源码中定义顺序的影响。

三.     对齐填充

HotSpot要求对象起始地址必须是8字节的整数倍,所以每个对象的大小也必须是8字节的整数倍。故对于大小不符合的对象,就进行对其填充。

所以视对象的大小不同,对齐填充并非必然存在。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JVM对象内存布局 的相关文章

  • 何时/为何使用/定义接口[重复]

    这个问题在这里已经有答案了 可能的重复 何时最好使用 java 中的接口 https stackoverflow com questions 2586389 when best to use an interface in java Hi
  • 透明平开窗

    我有一点JWindow上面有一个标志 用户可以将东西拖到上面 我主要在 OS X 上开发我的应用程序 为了获得我使用的透明窗口 setBackground new Color 0 0 0 0 在 Mac 上 这工作得很好 但在 Window
  • 设置 SWT Shell 的默认字体

    有没有办法为整个 Shell 设置默认字体 以便任何新控件都将使用相同的字体 看来现在我必须为我创建的每个控件设置字体 这导致了太多的冗余 默认使用的字体由平台选择 请参阅中的其他信息 类字体 SWT 标准小部件工具包 http book
  • 使用 jpql 和 jpa 从日期字段中提取年份

    我想从数据库中的一行中提取年份部分 以便将其与值进行比较 这是我的功能 public List
  • 无法实例化接收器 com.parse.GcmBroadcastReceiver

    我正在编写一个使用 GCM 通知和解析推送的离子应用程序 这个应用程序正在使用这些插件 com ionic keyboard 1 0 3 Keyboard com phonegap plugins PushPlugin 2 4 0 Push
  • 初级 Java 计数器代码

    我的教授希望我这样做 使用下面的 Counter 接口写入多个可互换计数器 public interface Counter Current value of this counter int value Increment this co
  • 在 Hibernate 中创建 UPDATE RETURNING 查询

    在 Oracle 中 我们可以创建一个更新查询 该查询将使用 RETURNING 子句返回更新的记录 Hibernate中有类似的功能吗 除了数据库生成的值之外 Hibernate 显然不需要返回更新的实例 因为对象传递给Session s
  • 正确使用 JDBC 连接池 (Glassfish)

    我需要在 Java Web 服务中作为会话 bean 实现数据库连接 但我不确定我这样做是否正确 我创建了一个类 public final class SQLUtils private static DataSource m ds null
  • Java 唤醒休眠线程

    我阅读了其他帖子 但没有找到我正在寻找的确切答案 所以我希望有人能给出一些澄清 我有一个将运行一段时间的程序 我有一些在后台运行的线程来执行各种任务 为了简单起见 让我们考虑 3 个线程 ThreadA每 10 秒执行一次任务 其中Thre
  • BlackBerry SQLite:将一个 SQLite 数据库连接到另一个

    我正在尝试使用 SQLite 将一个 SQLite 数据库附加到 BlackBerry 上的另一个数据库附加数据库 http www sqlite org lang attach html命令 Database d1 d2 Statemen
  • 从 sbt 程序集运行 uber jar 会导致错误:无法找到或加载主类

    我有一个使用 sbt 程序集插件打包为 uber jar 的 Spark 作业 这build sbt指定一个可运行的 main 作为生成的 uber jar 的目标 mainClass in assembly Some com foo Ba
  • 如何制作无限的jscrollpane?

    我之前已经实现过拖动滚动 但是创建无限滚动窗格的最佳方法是什么 当然不会有任何滚动条 我将实现拖动滚动 我想做的是在无限表面上实现动态加载 EDIT 当然 它实际上不会是无限的 我想问如何伪造它 您可以执行以下操作 AdjustmentCl
  • 如何通过子 POJO 的属性过滤复合 ManyToMany POJO?

    我有两个像这样的房间实体 Entity public class Teacher implements Serializable PrimaryKey autoGenerate true public int id ColumnInfo n
  • Java ConcurrentModificationException [重复]

    这个问题在这里已经有答案了 当删除倒数第二个元素时 没有 ConcurrentModificationException List
  • 是否可以为 azure blob 存储中的给定目录生成具有写入权限的 SAS(共享访问签名)

    我们的 blob 存储帐户结构 容器名称 simple 在这个容器内我们有 blob aa one zip aa two zip bb ss zip bb dd zip 是否可以生成对aa 目录 有写权限 但对bb 目录 没有访问权限的SA
  • 在服务器内部调用 Web 服务

    我有一个网络服务 getEmployee 当传递 id 时 它会获取单个员工的员工详细信息 同一服务器上的另一个 Web 服务 getEmployeeList 当传递一个部门时 它会获取整个员工列表 这将获取部门的 ID 然后调用 getE
  • Selenium - 等待网络流量

    我们将 Selenium 与 Java API 和一些 Javascript 用户扩展一起使用 我们在应用程序中使用了大量 AJAX 调用 我们的许多测试随机失败 因为有时 AJAX 调用完成得比其他时候慢 因此页面未完全加载 我们通过等待
  • 方法签名中带或不带synchronized关键字的方法具有相同的字节码

    对于以下 2 个类 获得相同的 Java 字节码 java版本 java 版本 1 8 0 181 Java TM SE 运行时环境 构建 1 8 0 181 b13 Java HotSpot TM 64 位服务器 VM 内部版本 25 1
  • 如何从spark中的hbase表中获取所有数据

    我在 hbase 中有一个大表 名称为 UserAction 它具有三个列族 歌曲 专辑 歌手 我需要从 歌曲 列族中获取所有数据作为 JavaRDD 对象 我尝试了这段代码 但效率不高 有更好的解决方案来做到这一点吗 static Spa
  • 如何使用剪辑来减少绘画时间?

    我正在尝试使用 Clip 来减少 CPU 负载 但剪辑在屏幕上留下了一些我似乎无法摆脱的垃圾 另外 打开和关闭剪辑似乎对 CPU 负载没有影响 在任一情况下 大部分时间似乎都花在重绘管理器和绘制缓冲图像上 import static jav

随机推荐

  • phpqrcode固定二维码大小

    我们都知道一个二维码PHP API接口使用phpqrcode php文件编写很容易就可以写出一个API接口 网页所出现的二维码图像一般都是随内容的增加而增加 我想要一个固定的png图像尺寸大小 怎么办 一般网上都会给出答案说确定img的尺寸
  • Android 内存泄露实践分析

    http wetest qq com lab view 161 html from adsout qqtips past2 sessionUserType BFT PARAMS 199168 TASKID ADUIN 576439313 A
  • Unity发布WebGL如何本地打开

    https blog csdn net blastblade article details 81170020
  • 淘宝镜像的使用

    1 切换淘宝镜像 npm config get registry 2 设置淘宝镜像 npm config set registry https registry npmirror com
  • 用java写一个多线程可断点续传的下载方法

    好的 我可以向你提供一个基本的多线程可断点续传的下载方法 首先 你需要创建一个线程类 用于下载文件的指定部分 这个线程类需要记录文件的开始和结束位置 并且在运行时使用这些位置来设置 HTTP 请求的 Range 头部 然后 你可以创建一个主
  • 搭建jeesite开发环境

    jeesite tomcat7 mysql eclipse maven jeesite下载路径 https github com thinkgem jeesite 下载jeesite并解压 在D 01 Projects 06 jeesite
  • 程序员必知的23种设计模式之模板模式

    文章目录 1 模式引出 豆浆制作问题 2 模板方法模式基本介绍 2 1 模板方法模式的原理类图 2 2 模板方法模式的钩子方法 3 方案实现 4 模板方法模式在Spring4框架的应用 5 模板方法模式的注意事项和细节 1 模式引出 豆浆制
  • 拍乐云首发音视频「分组讨论」开放能力,开启线上群聊互动新玩法

    苹果CEO库克近日宣布 因疫情反复 苹果将无限期推迟员工重返办公室计划 疫情常态化之下 在线工作 在线学习 在线娱乐也都变得常态化 我们似乎开始接受这种 All in在线 的模式 并对在线互动的体验提出了更高要求 当我们想要实现一个校招的网
  • java boolean空,Java检查布尔值是否为空

    How do you check if a boolean is null or not So if I know hideInNav is null How do I stop it from further executing Some
  • Jupyterlab使用plotly图片不显示解决方法

    问题 anaconda装好了plotly库 进入lab画图 发现不管怎样都显示空白 无法显示图片 解决方法 这是因为没有安装渲染支持的插件 在命令行输入 首先需要安装nodejs12 0 0以上版本 conda install nodejs
  • Pod 启动时命令和参数 与 dockerfile镜像区别

    主要是记录问题 如下文档 为容器设置启动时要执行的命令和参数 KubernetesDockerfile 中的 CMD 与 ENTRYPOINT sparkdev 博客园 K8s Pod Command 与容器镜像 Cmd 启动优先级详解 腾
  • Intellj IDE出现 java.lang.NoClassDefFoundError:

    在Intellj Idea中 主程序依赖了一个库modules 在模块中有一个dependence选项卡 把相关的依赖库选项的provided改为compile即可
  • python获取上一层文件夹路径

    https www cnblogs com yajing zh p 6807968 html
  • 零基础程序员自学编程的6种方法,你知道吗?

    随着互联网日趋迅猛 编程已经在我们生活当中无处不在了 众所周知 程序员的工资都很不错 于是越来越多的人 都想加入到编程的行业中来 那么如何加入到程序员的行业当中 PHP从入门到放弃 C语言从入门到放弃 Java从入门到放弃 Python从入
  • flutter创建项目指定语言

    每次新建Flutter项目都会去用命令来创建 因为不熟悉android的kottlin语言 每次都会抗拒一下 所以每次创建项目我都会选择去选用我熟悉的Java跟OC语言 直接上方法 注意 现在flutter创建的项目默认是swift跟kot
  • 如何实现在一个 Socket 应用程序中同时支持 IPv4 和 IPv6

    如何实现在一个 Socket 应用程序中同时支持 IPv4 和 IPv6 如何巧妙地设计代码结构 陈 鲁 软件工程师 IBM 孙 妍 软件工程师 IBM 简介 当今的网络主流是 IPv4 网络 但随着 IP 地址的日益短缺 IPv6 网络开
  • JSP页面获取cookie内容

    当使用jsp技术时会用到cookie保存一些信息 在后端逻辑代码设置cookie Cookie name new Cookie uname na Cookie pwd new Cookie upwd pw 设置最大存活时间180s name
  • vue之路由配置中的meta

    仅对以前所学做复习记录使用 meta 数据的元数据 也就是程序员可以自己自定义的一些变量
  • 5G QoS管理及与DRB映射关系

    前言 无线网络是一个等级森严的体系 一直以来 无线资源都是紧张的 因而无线网络上的各种业务所享受的服务也无法平等 网络需要优先保障重要的业务 比如 相比普通上网的数据业务 音视频数据业务的优先级会更高 相比音视频数据业务 语音通话的优先级会
  • JVM对象内存布局

    HotSpot虚拟机中 对象在内存中的存储布局分3部分 对象头 实例数据 对齐填充 一 对象头 对象头包含两部分信息 对象的运行时数据和类型指针 1 对象的运行时数据 对象的运行时数据非常多 主要有哈希码 GC分代年龄 锁状态标志 线程持有