一个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对象到底占用多大内存? 在网上搜到了一篇博客讲的非常好 ...
随机推荐
- DLX AlgorithmX
AlgorithmX精确覆盖: https://en.wikipedia.org/wiki/Knuth's_Algorithm_X DLX的基础算法 https://zh.wikipedia.org/ ...
- 网址中的静态资源 public
客户端浏览器收到的HTML响应内容中如果带有 link img script video audio 等带有src或者href标签时候,这些都是外部链接资源请求url.浏览器会默认自动性的对这些资源 ...
- Azure Storage 系列(五)通过Azure.Cosmos.Table 类库在.Net 上使用 Table Storage
一,引言 上一篇文章我们在.NET 项目中添加了 “WindowsAzure.Storage” 的 NuGet 包进行操作Table 数据,但是使用的 “WindowsAzure.Storage” ...
- css常用属性之display属性
1.dispaly属性之一:块级标签转行内便签display: inline(内容有多大,就展示多大(用F12看区别)) 2.display属性之二:行内便签转块级标签:diaplay: block ...
- Docker实战(2):主从库搭建
入门 基于Docker的Mysql主从复制搭建 首先安装docker 拉取mysql镜像:5.7版本 启动主从数据库容器 docker run -p 3339:3306 --name Maste -e ...
- 项目初始化CSS公共样式
/*! normalize.css v6.0.0 | MIT License | github.com/necolas/normalize.css */ /* Document =========== ...
- python中RGB色彩
turtle.colormode(mode)来改变色彩数值的使用 如果在修改颜色时写turtle.colormode(1.0) ,就需要使用RGB小数模式来去改变颜色 如果在修改颜色时写turtle. ...
- 虚拟机系列 | JVM特点,基础结构与执行周期
本文源码:GitHub·点这里 || GitEE·点这里 一.虚拟机简介 1.虚拟机概念 虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能的.运行在一个完全隔离环境中的完整 ...
- (jvm调优)一、linux内存查看命令
转载自https://blog.csdn.net/dongzhongyan/article/details/80067796 开始学习服务器性能查看以及调优 1.整体情况查看(任务管理器):top 第 ...
- Python 之父为什么嫌弃 lambda 匿名函数?
Python 支持 lambda 匿名函数,其扩展的 BNF 表示法是lambda_expr ::= "lambda" [parameter_list] ":" ...