返回信息流RT,在C++中一个空类的大小是1个字节,那么在JAVA中呢?求各位大神指点[ema0]
这是一条镜像帖。来源:北邮人论坛 / java / #39066同步于 2015/3/9
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
JAVA中一个空类占多大内存
AAAMWAAA
2015/3/9镜像同步10 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
Java对象在内存中由对象头、实例数据(成员变量)、对齐填充构成;一般32位机器对象头8字节,64位的16字节;实例数据的话Java中8种基本类型的大小是boolean 1字节、 byte 1字节、 short 2字节、 char 2字节、 int 4字节、 float 4字节、 long 8字节、 double 8字节、 引用类型的话是一个机器字长;对齐填充是为了保证内存大小为8字节的整数倍,不够的话就靠这部分填充。
【 在 chinababy 的大作中提到: 】
: Java对象在内存中由对象头、实例数据(成员变量)、对齐填充构成;一般32位机器对象头8字节,64位的16字节;实例数据的话Java中8种基本类型的大小是boolean 1字节、 byte 1字节、 short 2字节、 char 2字节、 int 4字节、 float 4字节、 long 8字节、 double 8字节、 引用类型的话是一个机器字长;对齐填充是为了保证内存大小为8字节的整数倍,不够的话就靠这部分填充。
多谢指点!
【 在 dss886 的大作中提到: 】
: 赞
:
别赞了,这种说法不对。
Java和JVM都规定了各个基本数据类型的范围,但都没有规定占用空间的大小。
JVM中的local variable:boolean,byte,char,short,int,float,reference都占一个local variable,long和double占两个相邻的local variable。
JVM中的operand stack:一个元素只能存储一个Java值,不管多大多小。
JVM中的堆上的对象:JVM Spec如此说:The Java Virtual Machine does not mandate any particular internal structure for objects.
具体的JVM实现可以采取很多不同的策略。
就拿reference来说,就有两种策略:
1. reference就是一个word,是指向对象存储空间的指针,指针头里存有对象的类型。
2. 每个reference都是两个word,第一个是对象的类型ID,第二个是指向对象存储空间的指针。JRocket使用这种策略,叫tagged reference。
至于对象头,多大都有可能,这是和JVM的实现非常相关的。比如:
1. 两个字节的头,一个是TIB,一个指针指向它的类型元数据,包括类型、虚函数表等。另一个包含锁、垃圾回收元数据等。
2. 把所有相同类型的对象存在一个固定大小(如32kb)并且对齐(如按32kb对齐)的page中,这个page的一开头储存这个类型的信息,这样每个单独的对象就没有头了。
再考虑局部变量:
1. 把这个局部变量分配到一个寄存器里,它从来不占用内存。
2. 多个变量共享一个内存空间(有时候一个变量不常用,要从寄存器里“踢”出来;另外一些时候另一个变量被“踢”出来,但只要一个临时空间就够了)
再考虑一个对象占多少空间:
1. 仿照C语言一样,按照平台的ABI给各个成员分配空间并对齐。
2. 如果一个JVM做escape analysis,会发现一个对象从来没有“逃离”一个函数。所以它干脆不在堆上分配空间了,把一个对象变成一堆局部变量。(这个优化叫object exploding)
再考虑虚函数的实现:
1. 老老实实把所有的函数都按虚函数实现。
2. 如果JVM发现目前一个类没有子类,那么,即使它不是final的,也把所有的方法调用按非虚方法来调用(这是作弊啊!!)。但是,一旦class loader装载了一个类,是它的子类(哎呀,要被抓住了!),就赶紧让线程们停下来,把所有的按非虚方法编译的代码都重新编译,然后,就好像它没有“作弊”一样。
所以,对于具体的JVM实现来说,对象、变量占多少空间,完全没准。还是那句话:“你可以作弊,只要不被抓住就行了”。
【 在 nuanyangyang 的大作中提到: 】
:
: 别赞了,这种说法不对。
: Java和JVM都规定了各个基本数据类型的范围,但都没有规定占用空间的大小。
: ...................
大神==
666666
虽然看不太懂
【 在 nuanyangyang 的大作中提到: 】
:
: 别赞了,这种说法不对。
: Java和JVM都规定了各个基本数据类型的范围,但都没有规定占用空间的大小。
: ...................
,,,好吧,应该点感谢
【 在 nuanyangyang 的大作中提到: 】
:
: 别赞了,这种说法不对。
: Java和JVM都规定了各个基本数据类型的范围,但都没有规定占用空间的大小。
: ...................
学习了
【 在 nuanyangyang 的大作中提到: 】
:
: 别赞了,这种说法不对。
: Java和JVM都规定了各个基本数据类型的范围,但都没有规定占用空间的大小。
: ...................
【 在 nuanyangyang 的大作中提到: 】
:
: 别赞了,这种说法不对。
: Java和JVM都规定了各个基本数据类型的范围,但都没有规定占用空间的大小。
: ...................
学习了!多谢暖神!