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字节。如下图所示:

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

  • 相关阅读:
    Insus Meta Utility
    The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine.
    Insus Binary Utility
    asp.net实现文件下载功能
    Column 'Column Name' does not belong to table Table
    程序已被编译为DLL,怎样去修改程序功能
    如何在Web网站实现搜索功能
    如何把数据流转换为二进制字符串
    Asp.net更新文件夹的文件
    如何显示中文月份
  • 原文地址:https://www.cnblogs.com/plf112233/p/3565913.html
Copyright © 2011-2022 走看看