【问题标题】:Are dereferenced static variables garbage collected?取消引用的静态变量是否被垃圾收集?
【发布时间】:2018-01-21 03:08:11
【问题描述】:

我知道如果不取消引用静态变量,它们会在应用程序的整个生命周期中持续存在。

但是如果静态变量被取消引用,它们会被垃圾收集吗?还是我只是不知道我在说什么?

谢谢

编辑

好的,我想我明白了。 本身没有静态对象,只有静态引用。静态引用在整个应用程序生命周期中持续存在,并且永远不会被垃圾收集。因此,它们指向的任何对象都不会被垃圾回收。此外,所有超出范围的非静态引用都将被垃圾收集。

我的理解正确吗?

再次感谢

【问题讨论】:

  • “我知道如果不取消引用静态变量,它们会在应用程序的整个生命周期中持续存在。” - 这个说法是错误的。可达性(和 GC)与跟随指针(取消引用)的操作没有直接关系。
  • 变量从不 GC'd。只有对象是。你以这种方式问这个问题一个问题。
  • 确实如此。 (我没有注意到......)这个错误表明你不了解变量和对象之间的区别。这真的令人担忧。
  • “是的,我确实理解对象和变量之间的区别。” - 那么你为什么要问变量是否可以被垃圾回收呢? (如果您真的了解其中的区别,那么这个问题显然是荒谬的。)

标签: java reference garbage-collection


【解决方案1】:

变量不会被垃圾回收,也不会被取消引用。 对象 如果没有引用,可能会被垃圾收集。 static 真的与此无关。

编辑

好的,我想我明白了。

让我们看看。

没有静态对象本身,有静态引用。

正确。

静态引用在整个应用程序生命周期中持续存在,并且永远不会被垃圾回收。

不正确。静态引用保存在类对象中。在某些情况下,这些类对象可以被垃圾收集。说引用被垃圾收集是没有意义的。

因此,它们指向的任何对象都不会被垃圾回收。

没有关于它的“因此”。当没有更多对它的引用时,一个对象有资格进行垃圾回收。零。 一个 对象包含对其进行垃圾收集的引用是必要的,但还不够。必须没有其他引用,并且垃圾收集器必须实际到达对象。

此外,所有超出范围的非静态引用都将被垃圾回收。

不正确。说引用被垃圾收集是没有意义的。

我的理解正确吗?

没有。

【讨论】:

  • 谢谢。你是什​​么意思静态引用保存在类对象中,在某些情况下可以被垃圾收集?我知道什么是类和对象,但我从未听说过类对象。我所知道的关于静态引用的所有信息,是它们进入堆中,而不是像自动变量那样进入堆栈。
  • @the_prole JVM 必须将static 字段的内容以及元信息保存在内存中。您可以称其为对象,也可以不称其为对象。但是,Java 端有 Class 对象,它可能被垃圾收集(如果它已通过自定义类加载器加载并且类加载器本身变得无法访问)。当一个 Class 对象被收集时,它所有相关的 JVM 端数据也将被释放,其中包括该类的 static 字段。
【解决方案2】:

对象驻留在堆中,引用可以驻留在堆或非堆区域的堆栈中。当一个对象被垃圾收集器标记为不可访问时,它就有资格进行垃圾收集。引用可以标记为静态,对象只是对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 2020-02-11
    • 2011-09-29
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    相关资源
    最近更新 更多