JAVA对象的创建及内存分配详解

概述

Java对象在内存存储的布局分为3块:对象头、实例数据和对齐填充

有数组情况下4字节 数组长度

对象头

对象头(Header)分为两部分:用于存储对象自身的运行时数据和类型指针

MarkWord: 哈希吗,GC分代年龄,锁状态标志,线程持有锁

|---------------------|-----|-----------|
| 存储内容 | 标志位 | 状态 |
| 对象哈希码、GC分代年龄 | 01 | 未锁定 |
| 指向锁记录的指针 | 00 | 轻量级锁定 |
| 指向重量级的指针 | 10 | 膨胀(重量级锁定) |
| 空,不需要记录信息 | 11 | GC标志 |
| 偏向线程ID、偏向时间戳、对象分代年龄 | 01 | 可偏向 |

Mark Word是一个非固定的数据结构,在极小的空间内存储尽量多的数据,会根据对象的状态复用自己的存储空间,如在32位HotSpot VM中,若对象处于未锁定状态,Mark Word的32bit空间中25bit用于存储对象哈希码,4bit用于存储对象分代年龄,2bit用于存储锁标志位,1bit固定为0,即32(存储空间)=25(哈希码)+4(分代年龄)+2(锁标志位)+1(固定0)

类型指针

对象指向它的类元数据的指针,虚拟机通过这个指针来确定对象是哪个类的实例,但是并非查找对象的元数据就一定要通过对象本身,也只是适用于普通对象,普通Java对象可以通过元数据信息可以确定Java对象的大小。不适用的Java对象,如Java数组对象的对象头中必须有一块能保持记录数组长度的数据,因为从数组元数据中无法确定数组的大小。

实例数据

实例数据(Instance Data)是对象真正存储的有效信息,也是程序代码中定义的各种类型的字段内容。这部分存储顺序会受到VM分配策略参数字段在Java源码中定义顺序的影响。 VM默认分配策略   HotSpot默认分配策略为longs/doubles、ints、shorts/chars、bytes/nooleans、oops,相同宽度的字段会被分配到一起,在父类中定义的变量会出现在子类之前。

对齐填充

对齐填充(Padding)是非必要的,只是起着占位符的作用。VM自动内存管理系统要求对象起始地址(对象大小)必须是8字节的整数倍,对象头都是8字节的整数倍,而实例数据部分若没有8字节的整数倍,可以通过对齐填充进行补全。

https://www.cnblogs.com/Andya/p/13337606.html

JVM对象创建和内存分配机制

方法区:运行时常量池,

一篇文章彻底搞懂JVM对象的创建和内存分配机制(深度剖析)_java中新建一个线程怎么分配内存的-CSDN博客

Java对象的创建、存储、访问_java构建product对象并存储到请求作用域中-CSDN博客

JVM调优工具

https://juejin.cn/post/7234545968094773307

Arthas、jstack、jstat 和 jmap 都是 Java 调优工具,但它们之间有以下区别:

  1. Arthas 是一款全新的 Java 诊断与调试工具,不仅可以执行传统的 JVM 监控命令,还提供了许多其他高级特性,如实时监控、动态修改代码、反编译等。相比较而言,jstack、jstat 和 jmap 更加基础,只提供了线程栈信息、垃圾回收信息、堆转储信息等。

  2. Arthas 的交互式命令行界面使得开发人员可以通过命令操作来查看和修改目标 JVM 的状态,支持实时监控和动态修改代码,极大地方便了开发和调试过程。而 jstack、jstat 和 jmap 只能通过命令行执行,无法进行实时交互。

  3. Arthas 支持监控线上应用,无需停机,对线上问题快速响应非常有优势。而 jstack、jstat 和 jmap 需要停止 JVM 进程才能进行相关分析。

虽然 Arthas、jstack、jstat 和 jmap 都是 Java 调优工具,但是 Arthas 具有更加强大的功能和交互式的命令行界面,可用于动态修改代码,更适合于在线上环境中进行 JVM 诊断和调试。而 jstack、jstat 和 jmap 更适合本地开发,或者需要停机分析的场景。

64位:Header(标记头8字节 + 对象指针8字节) + int(4字节)+ 对齐(4) = 24字节

参考文献

链接:https://juejin.cn/post/7234545968094773307

相关推荐
lsx202406几秒前
XHR 请求:详解与使用
开发语言
程序员老邢21 分钟前
【技术底稿 32】Nginx 经典大坑复盘:本机公网域名自环代理,导致接口返回首页 / 404 实战排障
java·运维·nginx·前后端分离·技术底稿·后端部署
海盗12341 小时前
C#在Distinct()中使用IEqualityComparer<T>
开发语言·c#
Vertira1 小时前
python 配置PostgreSQL 数据库
开发语言·python
该昵称用户已存在1 小时前
从成本中心到价值引擎:MyEMS 开源系统激活企业能源数据资产
java·后端·struts
隐退山林1 小时前
JavaEE进阶:SpringBoot配置文件
java·spring boot·java-ee
阿维的博客日记1 小时前
求解深分页问题,last pk适合什么情况
java·mysql·深分页
Highcharts.js1 小时前
Highcharts 纯 JavaScript 图表库深度使用评测
开发语言·前端·javascript·功能测试·ecmascript·highcharts·技术评测
瑶池酒剑仙2 小时前
C++类和对象完全指南:从封装继承多态到内存布局的面向对象宝典(雨夜论道)
c语言·开发语言·c++·visual studio
三品吉他手会点灯2 小时前
C语言学习笔记 - 27.C编程预备计算机专业知识 - 什么是字节
c语言·开发语言·笔记·学习