JAVA对象的内存华为出品

JAVA对象的内存布局

近期在写一个C++ 和java的socket通信程序。须要把收到的字节流转存到一个对象,引申出了这个问题,查找了一些网上的资料,总结例如以下

本文仅仅包括简单java对象的内存布局,不考虑继承的情况

 

 Java类的一个实例在内存中包括 对象头,非静态数据成员和对齐数据

 

静态数据成员,方法成员为类的全部实例共享。不保存在某个对象实例里

 

 

对象头的大小取决于于JVM的实现。同一个JVM,普通对象,数组对象。内部对象的对象头大小又有差别。

 

 

基本数据类型的大小JVM规范有明白定义,但引用类型在32bit JVM下是4字节,64bit JVM下是8字节(不启用指针压缩參数UseCompressedOops)。

 

32bit JVM 和 64bit JVM一般都是8字节(64 bit)对齐。

 

 

一个64bit JVM里面一个基本对象内存布局可能例如以下所看到的

 

 

数组对象的对象头是24字节,除去16字节基本信息,再加4字节长度数据。4字节对齐数据。另外。对象数组的每个元素保存的是对象的引用。

非静态的内部对象的对象头也是24字节。16字节的基本信息,加上一个外部类的引用8字节,64bit JVM是8字节,32bit JVM 是4字节加上对齐数据4字节。

假设对象的成员中,含有其它对象比方数组,字符串,这个对象仅仅保存这些成员对象的引用,这些成员对象的内存并不直接包括在这个对象的内存中,在它之外。 

 

非静态成员在对象内存中的位置和声明顺序是一致的吗?未必

 

我查找到了一篇相关博客,写于2008年http://www.importnew.com/1305.html

里面提到 Sun VM(如今已经是Oracle VM了,。。)并没有依照属性声明时的顺序进行内存布局,为了节省内存採用了下面顺序

1. 双精度型(doubles)和长整型(longs)

2. 整型(ints)和浮点型(floats)

3. 短整型(shorts)和字符型(chars)

4. 布尔型(booleans)和字节型(bytes)

5. 引用类型(references)

 

这篇博客提到了5个规则

规则1:不论什么对象都是8个字节为粒度进行对齐的。

规则2:类属性依照例如以下优先级进行排列:长整型和双精度类型。整型和浮点型;字符和短整型;字节类型和布尔类型,最后是引用类型。这些属性都依照各自的单位对齐。

规则3:不同类继承关系中的成员不能混合排列。首先依照规则2处理父类中的成员。接着才是子类的成员。

 

规则4:当父类中最后一个成员和子类第一个成员的间隔假设不够4个字节的话,就必须扩展到4个字节的基本单位

规则5:假设子类第一个成员是一个双精度或者长整型。而且父类并没实用完8个字节。JVM会破坏规则2。依照整形(int),短整型(short)。字节型(byte),引用类型(reference)的顺序,向未填满的空间填充。

 

 

所以这个规则还是比較复杂的

这篇博客写于2008年。JVM的实现非常可能已经变化,并且JVM版本号众多,了解这么多各自的规范是一件比較麻烦的事,从有用的角度来说,能够仅仅了解某个对象的布局

openJDK提供了一个工具。能够查看对象的内存布局,这篇博客里面介绍了这个工具http://blog.csdn.net/aitangyong/article/details/46416667,能够使用这个工具进行分析。

 

 

 

说明:

本文由giantpoplar发表于CSDN

文章地址 http://blog.csdn.net/giantpoplar/article/details/47657377

转载请保留本说明

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值