内存分配声明一个字段

时间:2011-06-30 13:34:12

标签: java memory object memory-management

在构建包含这些字段的对象时,Java会为private char letter;private int size;这样的字段分配多少内存?

5 个答案:

答案 0 :(得分:4)

这取决于虚拟机的实现。规范指定char原语类型的值范围为16位,但它没有指定虚拟机在堆上存储对象的 方式。

不需要这样详细的规范,因为VM不必能够从堆中交换或序列化原始对象


在评论中回应你的澄清:同样,它取决于实现,但有一些很好的理由在对象是“一次”时为所有类属性分配内存创建”。如果我们决定延迟分配,那么我们必须添加机制来在运行时动态调整堆上的对象,这非常昂贵。

如果我们在开始时立即保留所有空间,那么我们就不必在堆上调整数据大小或重新定位数据,因为数据结构的大小永远不会增大或缩小。

答案 1 :(得分:3)

在Oracle / Sun JVM中,每个对象都分配在一个8字节的边界上。因此,添加字段可能不会增加使用的内存量。但是,这里的指南是基元的大小

type           typical size
byte, boolean  1 byte
char, short    2 bytes
int, float     4 bytes
long, double   8 bytes

JVM是32位还是64位与原语的大小没有区别,但确实会改变引用的默认大小。

答案 2 :(得分:1)

我不知道JVM的特性, 但如果这可以帮助你char基元类型使用16位(Unicode字符)来存储数据,int使用32位

http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

我猜你可以通过创建一个非常简单的Java应用程序和一个非常简单的对象来测试它。 运行应用程序而不声明字段并检查它使用了多少内存(在Windows中按Ctrl + Shift + Escape),然后在分配这些字段时重新运行并检查差异。

答案 3 :(得分:1)

存储基元类型的Java类中的字段在创建对象时使用默认值进行初始化,因此我可以想象内存将被分配。

答案 4 :(得分:1)

这取决于实现。

早期的JVM实现更接近于类文件格式。在这种情况下,byteshortcharintfloat和引用占用一个广告位; longdouble两个广告位。因此,有效地将圆形大小最多为四个字节,这就是它在对象中占用的内存量。然后,对象的总数(包括标题)通常四舍五入为8个字节,以便更好地进行内存对齐。对于“压缩的oops”(64位平台上的32位引用,其中64位地址的底部位始终为零,允许移位引用并使用超过4 GB,同时保持引用低至4个字节),是一个很大的压力,以适应更大的尺寸。

但是在十年的最佳时间里,我们拥有64位JVM。这意味着更多的浪费,包括处理器内存带宽方面的浪费。因此,在现代实现中,对象布局被压缩,使得对象使用尽可能多的内存(加上标题和对齐舍入)。