【问题标题】:are java primitives garbage collected是java原语垃圾收集
【发布时间】:2013-09-11 16:41:17
【问题描述】:

如果我在 Java 中的方法中声明一个 int(或任何原始类型),该内存是在函数返回的那一刻被释放,还是必须在垃圾收集器清理它之前一直存在?

我知道在 C 中堆栈指针被重置并立即释放内存,并且我知道 Java 中的对象必须进行垃圾收集,但我不知道对原语采用哪种方法。

【问题讨论】:

    标签: java garbage-collection


    【解决方案1】:

    当一个方法被返回时,它栈上的变量总是立即被释放(当然,释放是指栈帧被销毁,所有附加到它的内存也像局部变量一样)。

    但是,如果该变量是一个对象,那么它的值就是一个指针。包含对象的实际内存(也可能具有指向其他对象的指针)将在堆上。当堆栈上的引用被释放时,该对象只是闲置而没有任何人引用它(除非您将引用放在其他地方)。那是java可能进来并收集垃圾的时候。那就是对象被标记为收集,下次收集器运行时它将清理该对象。

    基元有一个原始值,而不是指针。因此,正如其他答案中所述,无需对它们进行 GC。

    这非常类似于 C 中的 mallocfree

    当你 malloc 一些内存到 C 中的一个变量并且你的函数返回时,该指针的内存被释放,但不是它指向的内存。

    当您在 java 中创建一个对象时(可能使用 new 关键字),您正在为它分配内存。但是,您永远不会在 java 中显式调用 free。 JVM 会检测何时需要释放。

    您可以将引用设置为 null 以告诉 JVM 您不再需要它,但通常最好只使用最小范围。

    【讨论】:

      【解决方案2】:

      原语在堆栈上分配,因此在函数返回时释放它们的内存。

      【讨论】:

      • 这不是问题的一部分,但是对象的原始字段呢?
      • 原始字段(与所有字段一样)将与对象一起存储在堆中。
      【解决方案3】:

      是在函数返回的那一刻释放内存,还是在垃圾收集器清理它之前一直存在?

      方法内部声明的原语存储在该方法的堆栈帧中。由于方法一返回栈帧就被销毁,分配给局部变量的空间就被释放了。

      【讨论】:

        猜你喜欢
        • 2010-12-13
        • 1970-01-01
        • 2011-11-07
        • 2011-01-26
        • 2012-06-12
        • 2014-07-24
        • 2021-11-19
        • 2016-03-26
        • 2011-02-25
        相关资源
        最近更新 更多