【问题标题】:If a reference variable is set to null does it still consume memory? [duplicate]如果引用变量设置为 null 是否仍会消耗内存? [复制]
【发布时间】:2019-05-14 13:16:59
【问题描述】:

null 值只能赋予引用类型,如果我理解正确,它指向地址 0。此外,如果使用“new”关键字创建类的实例,我们正在为一个东西。我的问题是,如果我们将一个对象初始化为 null,它还会消耗内存吗?

【问题讨论】:

  • 您的意思是“将引用初始化为null”吗?如果您不创建对象,它不会占用任何内存(除了引用本身的几个字节)。
  • 你的车没有停在你的车库里,并不意味着你的车库就没有空间。
  • @AndyTurner 我不会做这个类比,我认为将引用与牵引挂钩进行比较更合适。汽车必须比车库小。牵引挂钩可以很小,但可以牵引巨大的负载。引用很小,但可以指向大对象。

标签: java


【解决方案1】:
int[] arr = null;

实际上并没有初始化任何东西。它只是创建了一个引用arr,它将指向地址0。所以不,它不会占用任何空间,除了引用arr本身占用多少空间(通常是4或8个字节,具体取决于系统)。

另一方面,这确实会初始化对象并将占用“大量”空间(至少是 10x int 的大小,因此 >= 40 字节):

int[] arr = new int[10];

【讨论】:

    【解决方案2】:

    我对你想说的有两种解释:

    初始化为NULL

    String hello = null;
    

    这甚至没有初始化任何东西。这就像有一个抽屉,在上面贴上标签,但实际上并没有在抽屉里放任何东西。结果,它不消耗任何内存

    设置为 NULL

    String hello = "hey there!";
    hello = null;
    

    这就像有一个装满东西的抽屉,然后把所有东西都拿出来扔掉。这仍然在消耗内存,因为你扔掉的旧东西仍然存在。为了摆脱旧的东西,垃圾收集通常迟早会启动并将其全部删除。你也可以手动System.gc(),不是我推荐的。

    【讨论】:

    • 你不能像int x = null;一样将primitive分配给null
    • System.gc(): "调用gc 方法suggests Java 虚拟机..." 意味着根本不保证任何垃圾回收都被执行.
    猜你喜欢
    • 1970-01-01
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-11
    • 2011-05-10
    相关资源
    最近更新 更多