论坛首页 入门技术论坛

Object object=new Object() -->多少byte?

浏览 3018 次
该帖已经被评为新手帖
作者 正文
   发表时间:2010-09-08   最后修改:2010-09-08

         
                                                       java中对象的大小
       在java中,一个空Object对象的大小是8byte,且这个只是保存在堆中没有任何属性的对象的大小,注意区分java中的堆和栈,堆是存储时单位,而栈是运行时单位

Object o=new Object();

 4byte       8byte

 

 

4byte:是上面部分所说的java栈中保存引用的所需要的空间
8byte:是java堆中对象的信息。

 

由于Java中 所有非基本对象都默认继承Object对象,因此不论是什么样的java对象,大小大于8byte。

 

看看这个例子

Class MyObject{
	int id;
	boolean flag;
	Object object;
}


      大小为:空对象8byte + int大小(4byte)+boolean大小(1byte)+空Object引用的大小(4byte)=17byte。但是java在对象内存分配时都 是以8的整数倍来分,因此大于17byte的最接近8的整数倍的是24,因此对象的大小为24byte。

     包装类型:因为这种包装类型已经成为对象了,因此需要把他们作为对象来看待。包装类型的大小至少是12byte(声明一个空Object至少需要的空 间),而且12byte没有包含任何有效信息,同时,因为Java对象大小是8的整数倍,因此一个基本类型包装类的大小至少是16byte。这个内存占用 是很恐怖的,它是使用基本类型的N倍(N>2),有些类型的内存占用更是夸张。因此,可能的话应尽量少使用包装类。

在JDK5.0以后,因为加入了自动类型装换,因此,Java虚拟机会在存储方面进行相应的优化。

 

 

 

class BaseUser{
      int id;
      long code;
      String name;
}
class Student extends BaseUser{
    Date createTime;
    int grade;
}

 

 问上面BaseUser 和 Student 对象的大小?

 

   发表时间:2010-09-08  
写的挺不错的,但是提供计算对象大小的方法,就更好了
0 请登录后投票
   发表时间:2010-09-08  
计算对象的大小啊  对象流  写到文件流写到硬盘  看大小
                    bytearrayoutputstream  字节数组的长度就是对象的大小
0 请登录后投票
   发表时间:2010-09-08  
帅的被神砍 写道
在java中,一个空Object对象的大小是8byte

首先Java语言规范和Java虚拟机规范都明确的不指定对象的大小,只规定了存储原始类型数据的slot的最小宽度。笼统的讨论“在Java中”对象的大小是不合理的——这种讨论只能针对某个特定的JVM实现而言。

现在的Sun JDK中的JVM,HotSpot,采用的对象布局方式就与早期的Sun JDK(1.0/1.1时代)的截然不同,占用的空间也不一样多。
再看一篇2002年老文,Sensible Sanitation -- Understanding the IBM Java Garbage Collector, Part 1: Object allocation,这里描述的当时的IBM JVM中,Java对象的对象头在32位系统上占有4×3 = 12字节,在64位系统上占有8×3 = 24字节。

话说回来,现在的HotSpot在32位系统上确实是使用8字节的对象头,而所有平台上的JRockit也是采用8字节的对象头。64位的HotSpot的对象头大小要看情况,例如说看UseCompressedOops有没有开。

HotSpot中Java对象的布局还受到FieldsAllocationStyle与CompactFields这两个参数的控制,后者也会影响到一个Java对象实际占用的大小。

看,“Java对象的大小”对同一个JVM在不同平台上,甚至同一JVM在同一平台上不同的启动参数,都可能不同。

帅的被神砍 写道
注意区分java中的堆和栈,堆是存储时单位,而栈是运行时单位

这是什么来的…?

顶楼的文章描述的对32位HotSpot的默认配置是基本成立的,但对该JVM的非默认配置就不一定了,对64位HotSpot或者其它JVM实现更加是没保证。就不提高性能JVM通过逃逸分析直接把对象分配给干掉了的情况了。

zjhzjf000 写道
计算对象的大小啊  对象流  写到文件流写到硬盘  看大小
bytearrayoutputstream  字节数组的长度就是对象的大小

一个Java对象原本在内存中占的空间跟序列化后的占的空间可以完全没有关系。原因不用多解释吧。
已被评为好帖!
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics