`
帅的被神砍
  • 浏览: 8674 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

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

阅读更多

         
                                                       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 对象的大小?

 

分享到:
评论
3 楼 RednaxelaFX 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对象原本在内存中占的空间跟序列化后的占的空间可以完全没有关系。原因不用多解释吧。
2 楼 zjhzjf000 2010-09-08  
计算对象的大小啊  对象流  写到文件流写到硬盘  看大小
                    bytearrayoutputstream  字节数组的长度就是对象的大小
1 楼 rocketball 2010-09-08  
写的挺不错的,但是提供计算对象大小的方法,就更好了

相关推荐

    c#实现object与byte[]互转

    c#实现object与byte[]互转、序列化

    jsp探针 ver0.1

    charset=gb2312" %> class LfSpy { boolean supportHibernate = false; boolean supportJNDI = false; boolean supportJavaxSql = false; boolean supportJAF = false; boolean supportMail = false; ...

    ASP.NET时尚编程百例(实例02)

    public void Page_Load(object sender,EventArgs e) { int re=0; int re1=0; GetRandomDefault(ref re); GetRandomDefault(ref re1); RandomNum.Text=re.ToString(); RandomNum.Text+=" "+re1.ToString() ; } ...

    foxboro的dcs系统往外发送的udp的接收程序

    foxboro的dcs系统往外发送的udp的接收程序 报文格式为: ...<length of object> ------- 1(for digital) / 2(for analog) byte(s) <date&time> ------- 21 bytes <object> ------- bytes <odd> ------- 1 bytes

    c# 制作和实现波形

    private List<byte> 数据采样 = new List<byte>(); private int 网格偏移 = 0; private Random 随机数 = new Random(); private const int 网格大小 = 12; private Pen 网格颜色 = new Pen(Color.FromArgb(0x00...

    ULT-C智能卡芯片开发软件,可读取芯片信息(中英版)

    ... ado.net/XML headers & schema ... ... <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> <comment>This is a comment</comment> </data>

    C#写gps中心服务处理程序

    <br> /// </summary><br> <br> private void menuItem1_Click(object sender,System.EventArgs e)<br> { <br> //<br> } <br> private void menuItem2_Click(object sender,System.EventArgs e)<br> { <br> ...

    freemarker总结

    其它的运行符可以作用于数字和日期,但不能作用于字符串,大部分的时候,使用gt等字母运算符代替>会有更好的效果,因为 FreeMarker会把>解释成FTL标签的结束字符,当然,也可以使用括号来避免这种情况,如:(x>y)> ...

    ssh(structs,spring,hibernate)框架中的上传下载

     本文后面的章节将从数据持久层->业务层->Web层的开发顺序,逐层讲解文件上传下载的开发过程。  数据持久层  1、领域对象及映射文件  您可以使用Hibernate Middlegen、HIbernate Tools、Hibernate ...

    asp连接数据库代码实例

    classname=<%=rs("classname")%>"><b><%=rs("classname")%></b></a> rs.movenext i=i+1 loop %> ---------------显示分类结束-------------------------- -------------显示现在所在分类开始---------------...

    打败所有黑客的加密算法

    这就是关键的地方,现在已经有很多加密算法,他们将我们传输的数据进行加密,但是请注意,既然可以加密就可以解密,你可能从网络上早已了解到,很多加密算法是如何的厉害,一台PC要暴利破解要多少年!可是你忽略了,...

    Java测试题2答案

    B<br>A ArrayList myList=new Object();<br>B List myList=new ArrayList();<br>C ArrayList myList=new List();<br>D List myList=new List();<br>2.paint()方法使用哪种类型的参数? A<br>A Graphics...

    scala-2.9.2.jar

    case '<' => Tape(tailOf(left), headOf(left), cell :: right) case '>' => Tape(cell :: left, headOf(right), tailOf(right)) case '.' => func.out(cell); this case ',' => copy(cell = func.in) case '['...

    密码加密工具

    /// <param name="decryptKey">解密密钥,要求为8位,和加密密钥相同</param> /// <returns>解密成功返回解密后的字符串,失败返源串</returns> public static string DecryptDES(string decryptString, string ...

    c# socket 编程

    MsgBuffer = new Byte[65535]; MsgSend = new Byte[65535]; //允许子线程刷新数据 CheckForIllegalCrossThreadCalls = false; this.UserName.Text = Environment.MachineName; } ...............

    KISDJ语音聊天

    byteData = new byte[1024]; //Receive data asynchornously. clientSocket.BeginReceiveFrom(byteData, 0, byteData.Length, SocketFlags.None, ref remoteEP, new AsyncCallback(OnReceive), null); 当...

    ZXing一维码/二维码使用文档

    IDictionary, Object> hints = new Dictionary, Object>(); hints.Add(EncodeHintType.CHARACTER_SET, "UTF-8"); byteMatrix = new MultiFormatWriter().encode(sTmp, BarcodeFormat.QR_CODE, 200, 200, hints); ...

    对象 Object 转换工具

    使用此工具类,对于Object和byte[] 数组, 16进制和String之间的转换

    TeeChart Pro Activex Control v2018

    static BYTE parms[] = VTS_I4; InvokeHelper(0x14, DISPATCH_METHOD, VT_DISPATCH, (void*)&pDispatch;, parms, SeriesIndex); return CSeries(pDispatch); } Projects should then compile without issue....

Global site tag (gtag.js) - Google Analytics