一个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对象到底占用多大内存? 在网上搜到了一篇博客讲的非常好 ...
随机推荐
- android studio配置so和assets目录
so配置: 1. 建立src/main/libs/armeabi目录,so文件放入armeabi目录 2.配置build.gradle android { defaultConfig{ XXXXXX ...
- 用 Spring Boot 和 MybatisPlus 快速构建项目
自动生成 public class MPGenerator { public static void main(String[] args) { AutoGenerator autoGenerator ...
- Python基本
Python基本规则 1.面向对象的跨平台的编程语言 2.文件类型是.py, 3.一个文件是一个模块module,运行整个文件 4.不支持非英文字符,区分大小写 5.一行是一条语句,多条语句写一行用; ...
- 01 fs模块
1 fs.readFile 异步执行函数 /** fs 读取文件相对路径是相对终端命令行所在的路径 process.cwd()返回终端命令行的绝对路径 * */ fs = require('fs') ...
- java之多态浅谈
多态是同一个行为具有多个不同表现形式或形态的能力. 父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为 多态现实意义理解: 现实事物经常会体现出多种形态,如学生,学生是人的 ...
- 使用Java7提供的WatchService给目录添加新建文件监控
程序: import java.io.IOException; import java.nio.file.FileSystems; import java.nio.file.Path; import ...
- axure rp extension for chrome怎么用
1)打开文件(原型图)的resources文件夹>chrome文件夹>将文件axure-chrome-extension.crx拉至谷歌浏览器的扩展程序页面,点击确定添加 2)提示出错时, ...
- 高可用服务之Keepalived利用脚本实现服务的可用性检测
上一篇博客主要聊到了keepalived高可用LVS集群的相关配置,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13659428.html:keepalive ...
- python修改excel内容
前提:安装pip install xlutils和xlrd 思路:xlrd用来读数据,xlutils用来修改数据:先打开excel——读到原来的sheet页——生成可以修改的excel和sheet页— ...
- JavaScript 伪Ajax请求
伪Ajax 通过iframe以及form表单,可以实现伪Ajax的方式. 并且它的兼容性是最好的. iframe iframe标签能够获取一个其他页面的文档内容,这说明它内部肯定是发送了一个请求,并且 ...