一个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对象到底占用多大内存? 在网上搜到了一篇博客讲的非常好 ...
随机推荐
- 初级知识六——C#事件通知系统实现(观察者模式运用)
观察者模式,绝对是游戏中十分重要的一种模式,运用这种模式,可以让游戏模块间的通信变得简单,耦合度也会大大降低,下面讲解如何利用C#实现事件通知系统. 补充,首先说下这个系统的实现原理,不然一头扎进去就 ...
- 面试【JAVA基础】阻塞队列
1.五种阻塞队列介绍 ArrayBlockingQueue 有界队列,底层使用数组实现,并发控制使用ReentrantLock控制,不管是插入操作还是读取操作,都需要获取锁之后才能执行. Linked ...
- 分享一个后端专用login模板
给大家啊分享一个后端专用login模板 Java工程师再也不用这样啦---> html源码 <html lang="en"> <head> <m ...
- UEFI、BIOS、GPT、MBR等概念的辨析
(本文转移自本人的旧博客) 从各个地方包括知乎,Wiki,CSDN搜索到的一些整理,这些概念极易混淆. 先说互相的关系 BIOS和UEFI是两种固件接口标准 MBR和GPT是两种分区表 Legacy模 ...
- nginx模型概念和配置文件结构
一. nginx模型概念: Nginx会按需同时运行多个进程: 一个主进程(master)和几个工作进程(worker),配置了缓存时还会有缓存加载器进程(cache loader)和缓存管理器进程( ...
- 推荐掌握Linux shell中这7种运算命令
#常见的算术运算符号 .+.-:加减 .*./.%:乘.除.取余 .**:幂运算 .++.--:增加记减少 .!.&&.||:取反,并且,或 .<,<=,>,=> ...
- Linux:基础命令三
一.软链接 相当于windows中的快捷方式,为了方便用户在使用时更快找到 ln -s /application/appche2.2.0/ /application/appche 注意: ...
- js垃圾回收和内存泄漏
js垃圾回收和内存泄漏 js垃圾回收 Js具有自动垃圾回收机制.垃圾收集器会按照固定的时间间隔周期性的执行. 1.标记清除(常用) 工作原理:是当变量进入环境时,将这个变量标记为"进入环境& ...
- JAVA JDK 环境变量配置 入门详解 - 精简归纳
JAVA JDK 环境变量配置 入门详解 - 精简归纳 JERRY_Z. ~ 2020 / 9 / 13 转载请注明出处!️ 目录 JAVA JDK 环境变量配置 入门详解 - 精简归纳 一.为什么j ...
- end的用法——print中加end=可以不换行展示
A=['hello','world',1,2,3]for i in A: print('正常输出i的值:',i) #打印出来的是换行展示hello world 1 2 3 print('加入sep后i ...