在构建包含这些字段的对象时,Java会为private char letter;
和private int size;
这样的字段分配多少内存?
答案 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实现更接近于类文件格式。在这种情况下,byte
,short
,char
,int
,float
和引用占用一个广告位; long
和double
两个广告位。因此,有效地将圆形大小最多为四个字节,这就是它在对象中占用的内存量。然后,对象的总数(包括标题)通常四舍五入为8个字节,以便更好地进行内存对齐。对于“压缩的oops”(64位平台上的32位引用,其中64位地址的底部位始终为零,允许移位引用并使用超过4 GB,同时保持引用低至4个字节),是一个很大的压力,以适应更大的尺寸。
但是在十年的最佳时间里,我们拥有64位JVM。这意味着更多的浪费,包括处理器内存带宽方面的浪费。因此,在现代实现中,对象布局被压缩,使得对象使用尽可能多的内存(加上标题和对齐舍入)。