zoukankan      html  css  js  c++  java
  • new一个Object对象占用多少内存?

    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 杨尚川
     */
    public class EmptyTest {
        
        public static void main(String[] args) throws InterruptedException{
            //加到集合中,使垃圾无法回收
            List<EmptyObject> 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字节。如下图所示:

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

  • 相关阅读:
    (4.12)全面解析-SQL事务+隔离级别+阻塞+死锁
    【生产问题】--8KW的数据表导致业务卡顿
    (4.6)数据页深入探索--内部探索聚集索引
    (4.11)DBCC 常用命令
    数据库设计与性能优化
    有些事女人忍受不了
    android系列控件
    java常量
    context startactivity
    AssetManager
  • 原文地址:https://www.cnblogs.com/plf112233/p/3565913.html
Copyright © 2011-2022 走看看