java计算一个实例对象占用空间大小的方法分享
2023-03-31 10:44:51 时间
转自:http://www.java265.com/JavaJingYan/202110/16349927561557.html
下文笔者将讲述一个java对象占用空间大小的方法分享,如下所示:
对象头
一个对象头部至少有两个WORD
如果对象是数组,则需要三个WORD,如下:
- 对象的HashCode,锁信息
- 对象类型数据的指针
- 数组的长度(对象为数组)
计算规则
在Java代码中,任何对象都是8字节对齐
属性按照[long,double]、[int,float]、[char,short]、[byte,boolean]、reference的顺序存放
例:
public class Test {
byte a;
int b;
boolean c;
long d;
Object e;
}
当一个对象的属性按照以上顺序存储, 则其占用空间为 head(8) + a(1) + padding(3) + b(4) + c(1) + padding(7) + d(8) + e(4) + padding(4) = 40 如果按照这个规则得到:head(8) + d(8) + b(4) + a(1) + c(1) + padding(2) + e(4) + padding(4) = 32 可以解决很多空间
在涉及继承关系时, 则我们会按照一个基本的原则, 先放父类中的成员 然后再放入子类中的成员 例:
class A {
long a;
int b;
int c;
}
class B extends A {
long d;
}
按照以上规则的存储空间大小为:
head(8) + a(8) + b(4) + c(4) + d(8) = 32
当父类中的属性不够八个字节时,
父类中最后一个成员与子类的第一个成员的间隔如果不够4个字节,
此时需要扩展到4个字节的基本单位
例:
class A {
byte a;
}
class B extends A {
byte b;
}
占用大小为:
head(8) + a(1) + padding(3) + b(1) + padding(3) = 16
-------------------------------------------------------
当子类的第一个成员是double或long
且父类未用完8个字节
JVM会破坏规将较小的数据填充到该空间
例:
class A {
byte a;
}
class B extends A {
long b;
short c;
byte d;
}
按照以上的占用空间大小为:
head(8) + a(1) + padding(3) + c(2) + d(1) + padding(1) + b(8) = 24
相关文章
- 深入探讨Java中的异常与错误处理
- 研究学习Kotlin的一些方法
- 数据显示Java热度持续下落,日子屈指可数?
- 2017年5月编程语言排行榜:Java与C语言优势正开始缩小
- Java多线程之内置锁与显示锁
- Java线程池的理论与实践
- 白话阿里巴巴Java开发手册(编程规约)
- 关于Java你不知道的十件事
- Java服务化系统线上应急和技术攻关,你必须掌握的Linux命令
- Java实现高斯模糊和图像的空间卷积
- Java阻塞队列实现原理分析
- NPM使用技巧
- Node.js对Java开发者而言是什么?
- Java反射机制应用实践
- 理解RxJava中的Single和Completable
- 2017年你不能错过的Java类库
- 大规模集群下的Hadoop NameNode
- 从源码解密Spark内存管理
- 2017年3月编程语言排行榜:Swift首次进入前十
- JVM热点技术:Java类的加载机制