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

/***************************************************

 * TODO: description .

 * @author: gao_chun

 * @since:  2015-4-2

 * @version: 1.0.0

 * @remark: 转载请注明出处

 **************************************************/


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来查看分配的空间有多大,至于存了什么内容,现在还不清楚。


    /**
     * 构造一个无任何字段的空对象占多少内存
     * @author gao_chun
     */  
    public class EmptyTest { 
        public static void main(String[] args) throws InterruptedException{  
            //加到集合中,使垃圾无法回收  
            List emptys = new ArrayList<>();  
            for(int i=0;i<100;i++){  
                emptys.add(new EmptyObject());  
            }  
            //打开jvisualvm,查看EmptyObject的大小为16字节  
            Thread.sleep(60*1000);  
        }  
        private static class EmptyObject{}  
    } 


这里面new不同的对象数(for循环次数),结果都是一样,我的JDK是64位,8字节是引用,8字节是堆内存,总共是16字节。如下图所示:

 new一个Object对象占用多少内存?_第1张图片

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

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

你可能感兴趣的:(java技术笔记,Android性能优化,java应用技巧,内存,对象,object,java)