new一个Object对象占用多少内存?

news/2024/7/5 14:36:54

Java的自动内存管理机制省却了很多编码工作,大大地提高了Java的生产力,而且JVM的性能也越来越好,特别是G1的出现,改善了垃圾回收中stop the world的状况。

 

也许很多人都没有考虑过这个问题,new一个Object对象到底占用多少内存呢( Object obj = new Object() )?

 

这里很明确的是obj是一个指向对象的引用,引用的长度决定了Java的寻址能力,32位的JDK是4字节,64位的JDK是8字节。

 

因为obj对象没有任何数据(field),会在堆上为它分配空间吗?如果分配空间,里面存储了什么内容?

 

以面向对象的思维来分析,对象封装了数据和行为,是一个统一的整体,虽然obj对象没有数据,但是有行为(Object类定义了12个方法)。当我们执行完new操作后,obj的值为堆内存的地址,既然obj都指向一块内存了,说明是会在堆上为其分配空间的。

 

那么分配的空间有多大,存储了什么内容呢?我在JVM规范和JAVA语言规范里面没有找到相关的描述,这可能是属于JVM实现自由控制的范畴了。我们可以利用JDK自带的工具jvisualvm.exe来查看分配的空间有多大,至于存了什么内容,现在还不清楚。

 

Java代码  收藏代码
  1. /** 
  2.  * 构造一个无任何字段的空对象占多少内存 
  3.  * @author 杨尚川 
  4.  */  
  5. public class EmptyTest {  
  6.       
  7.     public static void main(String[] args) throws InterruptedException{  
  8.         //加到集合中,使垃圾无法回收  
  9.         List<EmptyObject> emptys = new ArrayList<>();  
  10.         for(int i=0;i<100;i++){  
  11.             emptys.add(new EmptyObject());  
  12.         }  
  13.         //打开jvisualvm,查看EmptyObject的大小为16字节  
  14.         Thread.sleep(60*1000);  
  15.     }  
  16.     private static class EmptyObject{}  
  17. }  

 

 

我们在这里面通过new不同的对象数(for循环次数),来分析内存占用,new 1个对象是16字节,new 2个对象是32字节,new 100个对象是1600字节,通过很多次的尝试,我们从jvisualvm里面可以看到 字节数=对象数*16 ,我们有理由相信对象数跟字节数的线性关系。从这里可以看出,jvisualvm显示的内存占用跟引用的4字节或8字节是没有关系的,也就是说,jvisualvm显示的是堆内存占用,这也很好理解,毕竟所有引用的字节占用是固定的。我的JDK是64位,8字节是引用,16字节是堆内存,总共是8+16=24字节,所以new一个Object对象占用24字节。如果JDK是32位,则new一个Object对象占用4+16=20字节,如下图所示:



 

那么分配的16字节的堆空间中存储了什么内容呢?当我们Object obj = new Object();的时候,在栈内存中有一个引用obj,他可能是32位也可能是64位,obj实质只是一个内存地址,那么当我们调用obj.xxx()的时候,JVM怎么知道obj是哪个类的实例呢?所以,可以大胆地推测,obj对象的16字节的堆内存中记录了对象属于哪个类的信息,问题是这16字节的结构是什么样的?不清楚!

 

我们研究new一个Object对象占多少内存可能没什么实际意义,因为我们在编程的时候就可以确定对象树,基本可以确定对象大小,除了变长字段,当然,变长字段我们一般也会有长度限制。所以我们真正关心的是所有数据最终的大小,也就是数据库的大小。

 

那么这种没有什么实际意义的问题为什么要研究呢?我觉得只能用三个字来形容:好奇心。好奇心是驱使我们研究技术的强大推力,当我们工作了很多年,尤其是在不重视技术的公司,我们对技术还有激情吗?保持一颗敏感好奇的心,也许技术之路可以走的更长更远。


http://www.niftyadmin.cn/n/3649589.html

相关文章

[Domino]“java.lang.ClassCastException:lotus.domino.cso.Item”异常解决办法

[Domino] “java.lang.ClassCastException&#xff1a;lotus.domino.cso.Item”异常解决办法编写者日期关键词郑昀ultrapower2005-6Java Domino RichTextItem通过Domino的Document.getFirstItem("Body")是可以获取当前邮件的Body字段&#xff0c;并试图直接转换为Ric…

命令行基础知识:使用ImageMagick调整图像大小

If you’ve ever done programmatic image manipulation (especially in PHP) you have probably encountered the ImageMagick library or it’s major fork, GraphicsMagick. In addition to being able to leverage it’s power from many popular programming languages, y…

什么是华为认证?HCIA HCIP HCIE分别是什么认证体系?

一、华为公司简介 华为创立于1987年&#xff0c;是全球领先的ICT (信息与通信&#xff09;基础设施和智能终端提供商&#xff0c;我们致力于把数字世界带入每个人、 每个家庭、每个组织&#xff0c;构建万物互联的智能世界。目前华为有18.8万员工&#xff0c;业务遍及170多个国…

Sync4j的Nokia手机实践结果

配置好Sync4j服务器后&#xff0c;我在Nokia手机上设置好同步&#xff0c;准备和这个远端服务器进行联系人的同步。下面的日志记录了两次失败的过程&#xff1a;第一次手机登录&#xff1a;由于Sync4j对设备要求事先在管理控制台上配置好&#xff0c;并添加规则&#xff0c;才能…

jarhoo是一个很棒的地方

jarhoo是一个很棒的根据类名找jar包的地方&#xff0c;。在写程序的时候&#xff0c;我反正是经常遇到某一个类声明不知道是哪一个jar包的&#xff0c;比如某一个开源包报告了java.lang.NoClassDefFoundError: javax/servlet/http/HttpSessionListener错误&#xff0c;搞得满世…

服务周期性工作内容_使服务工作者生命周期神秘化

服务周期性工作内容介绍 (Introduction) Service workers play a very vital role in Progressive Web Apps (PWA), as they are responsible for offline caching, push notifications, background sync etc. In this article, we’ll be demystifying the service worker lif…

Adobe Dreamweaver CC 2019 安装教程

一、DW简介 Adobe Dreamweaver&#xff0c;简称“DW”&#xff0c;中文名称 “梦想编织者”&#xff0c;最初为美国MACROMEDIA公司开发 &#xff0c;2005年被Adobe公司收购。DW是集网页制作和管理网站于一身的所见即所得网页代码编辑器。利用对 HTML、CSS、JavaScript等内容的…

Json的知识点全解析,解析json数据的好工具大全

一、Json知识点 待续。。。。。。 二、Json解析工具 1、fastjson网址&#xff1a;http://fastjson.codeplex.com/ 教程博客&#xff1a;fastjson教程&#xff08;http://blog.sina.com.cn/s/blog_7ffb8dd501013qas.html&#xff09;2、网站&#xff1a;bejson网址&#xff1a;h…