一个Java对象的内存布局
1.对象的创建过程
- class loading
- class linking(verification,preparation,resolution)
- class initializing
- 申请对象内存
- 给对象的成员变量赋默认值
- 调用构造方法
- 成员变量顺序赋初始值
- 执行构造方法语句(如果有父类,则先调用父类的构造方法)
2.对象在内存中的存储布局
由于对象在内存中分配非常的依赖环境配置,所以先看下虚拟机的配置
1.观察虚拟机的配置
java -XX:+PrintCommandLineFlags -version

- 普通对象(
new Object() = 12个字节(对象头+classpoint = 12,由于有padding对齐:8的倍数,因此至少为16个字节)
对象头:markword 8个字节
ClassPoint指针:(默认4个字节)
指向xxxx.class源文件
-XX:+UseCompressedClassPointers 为4字节 不开启为8字节
实例数据(成员变量,没有成员变量则为0):
引用类型:-XX:+UseCompressedOops 为4字节 不开启为8字节
Padding对齐
不占用内存,知识一个对象的内存分配规则:以8的倍数为单位分配,比如new Object是12,但还是要分配16个字节
- 数组对象(默认20字节,关闭classpoint压缩时为24字节)
比普通对象多了一个数组长度(4个字节)
3.对象头具体包括什么
- 锁状态信息两位代表对象有没有被锁定
- GC标记被回收了多少次了,分代年龄
4.对象怎么定位,即T t = new T();这个t时如何找到这个对象的?
参考文章:https://blog.csdn.net/clover_lily/article/details/80095580
- 句柄池
- 直接指针

这两者没有优劣之分,有的虚拟机使用句柄池,有的虚拟机使用直接指针
HotSpot使用的是直接指针,直接指针效率比较高直接找到对象,
句柄池要找一个指针再找下一个,但是GC的时候效率比较高
5.Object c = new Object()在内存中占用多少字节?
普通对象:16字节
mark word(8)
class point(4)
padding(4) = 16
new int[] :16个字节
mark word(8)
class point(4)
数组长度(4)
padding(0) = 16
7.为什么GC年龄默认为15?
最大是15
一个Java对象的内存布局的更多相关文章
- JVM总结-java对象的内存布局
在 Java 程序中,我们拥有多种新建对象的方式.除了最为常见的 new 语句之外,我们还可以通过反射机制.Object.clone 方法.反序列化以及 Unsafe.allocateInstance ...
- Java对象的内存布局以及对象的访问定位
一 Java对象的内存布局 在HotSpot虚拟机中,对象在内存中的布局分为3个区域 对象头(Header) Mark Word(在32bit和64bit虚拟机上长度分别为32bit和64bit)存储 ...
- 3 Java对象的内存布局以及对象的访问定位
先来看看Java对象在内存中的布局 一 Java对象的内存布局 在HotSpot虚拟机中,对象在内存中的布局分为3个区域 对象头(Header) Mark Word(在32bit和64bit虚拟机 ...
- Java对象的内存布局
对象的内存布局 平时用java编写程序,你了解java对象的内存布局么? 在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域: 对象头 实例数据 对齐填充 对象头 对象头包括两部分信息: ...
- Java对象的内存布局以及对象所需内存大小计算详解
1. 内存布局 在HotSpot虚拟机中,对象的内存布局可以分为三部分:对象头(Header). 实例数据(Instance Data)和对齐填充(Padding). 1) 对象头(Header): ...
- 10 Java 对象的内存布局
Java 创建对象的方式 1:new 语句和反射机制创建.该方式会调用类的构造器,同时满足诸多约束.如果一个类没有构造器的话,Java 编译器会自动添加一个无参数的构造器.子类的构造器需要调用父类的构 ...
- 深入理解 Java 对象的内存布局
对于 Java 虚拟机,我们都知道其内存区域划分成:堆.方法区.虚拟机栈等区域.但一个对象在 Java 虚拟机中是怎样存储的,相信很少人会比较清楚地了解.Java 对象在 JVM 中的内存布局,是我们 ...
- java对象的内存布局(二):利用sun.misc.Unsafe获取类字段的偏移地址和读取字段的值
在上一篇文章中.我们列出了计算java对象大小的几个结论以及jol工具的使用,jol工具的源代码有兴趣的能够去看下.如今我们利用JDK中的sun.misc.Unsafe来计算下字段的偏移地址,一则验证 ...
- 一个Java对象到底占用多大内存?
最近在读<深入理解Java虚拟机>,对Java对象的内存布局有了进一步的认识,于是脑子里自然而然就有一个很普通的问题,就是一个Java对象到底占用多大内存? 在网上搜到了一篇博客讲的非常好 ...
随机推荐
- checkbox手动样式改变
.image_input_checkbox{ width:18px; height:18px; display: inline-block; vertical-align: middle; -webk ...
- 解决Oracle在win10 64使用plsql 无法显示表
将当前用户切换至所有用户,然后再切换至当前用户,问题解决 图中sql也可查询出当前库中存在的表: select object_name from user_objects where lower(ob ...
- 1.spring boot初始化项目
初始化spring boot项目的方式非常多,如使用Spring Tool Suite.使用IntelliJ IDEA.使用NetBeans.在start.spring.io网站中.curl命令.sp ...
- C014:不用算术分割显示逆序三位数
程序: #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { int handred,ten,ge; do{ pri ...
- Tomcat源码分析(从启动流程到请求处理)
Tomcat 8.5下载地址 https://tomcat.apache.org/download-80.cgi Tomcat启动流程 Tomcat源码目录 catalina目录 catalina包含 ...
- PHP的九个超全局变量
1. 什么是超全局变量 PHP官网:超全局变量 超全局变量就是在全部作用域中始终可用的内置变量. 全局作用域.函数作用域都可以使用的PHP内置变量. 在函数或方法中无需执行 global $varia ...
- JZOJ1496 页
Description 战神阿瑞斯听说2008年在中华大地上,将举行一届规模盛大的奥林匹克运动会,心中顿觉异常兴奋,他想让天马在广阔的天空上,举行一场精彩的天马队列变换表演.首先,战神安排n头高度不同 ...
- 《C++深度解析》课程目录
<C++深度解析>课程目录 第1课 - 学习 C++ 的意义 第2课 - C到C++的升级 第3课 - 进化后的const分析 第4课 - 布尔类型和引用 第5课 - 引用的本质分 ...
- 关于java数组基础练习题
定义一个int[] a ={4,2,0,-1,-8,23,9}求数组元素的最大值.最小值.平均数.总和.数组的复制.反转 //3.定义一个int[] a ={4,2,0,-1,-8,23,9}求数组元 ...
- 你还在寻找Navicat的破解版本?你应该了解开源免费的DBeaver
前言 你是否还在各个"免费绿色"的下载网站上寻找navicat的破解版本,或者已经通过某些方式破解了navicat的特定版本.你或者是在一家对安全和软件著作权比较看重的公司,明令禁 ...