Java对象内部结构
2023-04-18 12:53:49 时间
Java对象内部结构分析
(在压缩指针情况下分析)
对象头
- 对象头占用12个字节,存储内容包括对象标记(markOop)和类元信息(klassOop)。
- 对象标记存储对象本身运行时的数据,如哈希码、GC标记、锁信息、线程关联信息等,这部分数据在64位JVM上占用8个字节,成为"Mark Word"。
- 为了存储更多的状态信息,对象标记的存储格式是非固定的(具体与JVM的实现有关)。类元信息存储的是对象指向它的类元数据(即Klass)的首地址,占用4个字节.
实例数据
存储本类对象的实例成员变量和所有可见的父类成员变量。如Interger的实例成员只有一个private int value ,占用4个字节,所以加上对象头为16个字节, 需要注意计算子类占用时,需要加上父类的所有字段
对齐填充
对象的存储空间分配单位是8个字节,如果一个占用大小16个字节的对象,增加一个成员变量byte类型,此时需要占用17个字节,但是也会分配24个字节进行对齐填充
实战(评估对象占用字节)
class RefObjectDemo {
//对象头最小占用空间12个字节
//byte 基础类型占用 1个字节
byte b;
//short 基础类型占用 2个字节
short s;
//int 基础类型占用 4个字节
int i;
//long 基础类型占用 8个字节
long l;
//float 基础类型占用 4个字节
float f;
//duuble 基础类型占用 8个字节
double d;
//boolean 基础类型占用 1个字节
boolean b1;
//char 基础类型占用 2个字节
char c;
//引用变量类型占用是4个字节
Object o;
//double 类型占用8个字节,但此处是数组引用变量 所以占用4个字节
//注意并不计算 new double[1000]
//这个数组引用的是double[]类型,指向实际分配的数组空间首地址
//在new对象时,已经实际分配空间
double[] d=new double[1000];
}
//12+1+2+4+8+4+8+1+2+4+8 = 54字节
//取8的倍数为56个字节
//对象填充 2个字节
相关文章
- Jease 2.6发布 Java开源内容框架
- JVM调优总结:反思
- JVM调优总结:调优方法
- JVM调优总结:新一代的垃圾回收算法
- JVM调优总结:典型配置举例
- JVM调优总结:分代垃圾回收详述
- JVM调优总结:垃圾回收面临的问题
- JVM调优总结:基本垃圾回收算法
- JVM调优总结:一些概念
- 用Java GUI编写的画板程序
- Java的动态绑定机制
- jOOQ 2.0.2发布 Java的ORM框架
- Java中带复选框的树的实现和应用
- Java网络编程菜鸟进阶:TCP和套接字入门
- 甲骨文与谷歌专利权之争定于今年三月开审
- Java调用C/C++编写的第三方dll动态链接库
- 集成开发环境 NetBeans IDE 7.1正式版发布
- kangle 2.7.5紧急发布 防hash碰撞攻击
- 东方通技术引领模式为国产软件“争权”
- UML中关联,组合与聚合等关系的辨析