一个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对象到底占用多大内存? 在网上搜到了一篇博客讲的非常好 ...
随机推荐
- Maxscript中渲染中文版Vray完成贴图(VrayCompleteMap)的方法
Objbakeproperties = $.INodeBakeProperties; --选定对象的烘培节点 Prjbakeproperties = $.INodeBakeProjProperties ...
- POJ-1273Drainage Ditches(网络流入门题,最大流)
Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover patch. This ...
- 答应我,用了这个jupyter插件,别再重复造轮子了
1 简介 在使用Python.R等完成日常任务的过程中,可能会经常书写同样或模式相近的同一段代码,譬如每次使用matplotlib绘制图像的时候可以在开头添加下面两行代码来解决中文乱码等显示问题: p ...
- 从架构到部署,全面了解K3s
Kubernetes无处不在--开发者的笔记本.树莓派.云.数据中心.混合云甚至多云上都有Kubernetes.它已然成为现代基础设施的基础,抽象了底层的计算.存储和网络服务.Kubernetes隐藏 ...
- 鼠标移到图片上图片放大【css3实例】
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- latex tips
latex tips latex 插入图片 主要是插入图片位置的问题,代码中的 bb= 决定了插入 fig2.eps 图片的某一方形区域,其中 表示该方形区域的左下角像素坐标是 0 0 ...
- 深入理解Java之装箱与拆箱
一.Java数据类型 1.在说装箱与拆箱之前,先说一下Java的基本数据类型,Java从数据类型上可以划分为值类型与引用类型,值类型是四类八种,分别是: 整数型:byte̵,short̵,int̵,l ...
- 修改mysql、oracle、sqlserver默认端口
一.修改mysql默认端口1202 1.修改mysql安装路径下的my.ini文件中的2个port值 2.修改后重启服务,win+r输入services.msc进入服务,重启服务 二.修改oracle ...
- git仓库个人和企业版新增仓库和成员
1.首先要在本地安装一个git安装包,比如安装完之后路径是在 D:\Program Files (x86)\Git\bin\git.exe 2.访问git网址 https://gitee. ...
- Unit4:碎片
基本使用 动态调用 碎片和活动 碎片周期