`
帅的被神砍
  • 浏览: 8919 次
  • 性别: 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[]互转 在C#中,实现object与byte[]互转是一种常见的需求,特别是在网络通信和数据存储中。这篇文章将详细介绍如何将object转换为byte[],并介绍相关的知识点。 序列化 序列化是将对象转换为二...

    jsp探针 ver0.1

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

    Unity 序列化反序列化工具-UTF8Json1.3.7.1

    // Object -> byte[] (UTF8) byte[] result = Utf8Json.JsonSerializer.Serialize(p); // byte[] -> Object var p2 = Utf8Json.JsonSerializer.Deserialize<Person>(result); // Object -> String var json = Utf8...

    how-to-ejb-cmpblob

    本教程“how-to-ejb-cmpblob”聚焦于EJB中的CMP(容器管理持久化)和BLOB(Binary Large Object)的使用,这在处理大量非结构化数据时非常常见。 CMP(Container Managed Persistence)是EJB提供的一种自动数据...

    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

    常用控件简写命名规范1

    - 字节:Byte -> byt (如:bytPixelValue) - 字符:Char -> chr (如:chrDelimiter) - 日期时间:DateTime -> dtm (如:dtmStartDate) - 十进制:Decimal -> dec (如:decAverageHeight) - 双精度浮点数:...

    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>

    freemarker总结

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

    Android开发技巧总汇(5)

    - 调用`mapController.animateTo(new GeoPoint(latitude, longitude))`来移动地图中心到指定坐标。 #### 2. 获得联系人 在Android应用中获取联系人列表是一种常见的需求。这通常涉及到读取设备的联系人数据库。 ...

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

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

    Tomcat和weblogic中文乱码问题解决方案

    * Return the HttpServletRequest holded by this object. */ private HttpServletRequest getHttpServletRequest() { return (HttpServletRequest) super.getRequest(); } / * 读取参数 -- 修正了中文问题....

    CoreJavaNote.pdf

    - 生命周期:从使用`new`关键字创建对象开始,直到该对象被垃圾回收。 - 特点: - 每个对象都有自己的副本,互不影响。 - 默认初始化: - 数字型实例变量默认为0。 - `char`类型默认为`\u0000`(空字符)。 -...

    Unity3D教程:用ScriptableObject打包数据2

    public byte[] content; } ``` 在这个类中,我们定义了两个字段:`fileName`用于存储CSV文件的名称,`content`用于存储CSV内容的字节数组。 接下来,我们需要编写打包函数,将CSV数据转换为ScriptableObject并...

    asp连接数据库代码实例

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

    读取数据库记录的图像字段 编程小实例,C++.net源代码编写

    byte* imageData = new byte[reader->GetSqlBytes(1)->Length]; reader->GetSqlBytes(1)->CopyTo(imageData, 0); // 将图像数据保存到本地文件或处理以显示在应用程序中 } reader->Close(); connection->Close()...

    Qt 使用QPainter类在子控件上画图

    Q_OBJECT public: explicit EventFilter(QObject *parent = nullptr) : QObject(parent) {} bool eventFilter(QObject *watched, QEvent *event) override; }; // 在子控件构造函数中安装事件过滤器 MyWidget::...

    打败所有黑客的加密算法

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

Global site tag (gtag.js) - Google Analytics