【发布时间】:2013-09-11 16:41:17
【问题描述】:
如果我在 Java 中的方法中声明一个 int(或任何原始类型),该内存是在函数返回的那一刻被释放,还是必须在垃圾收集器清理它之前一直存在?
我知道在 C 中堆栈指针被重置并立即释放内存,并且我知道 Java 中的对象必须进行垃圾收集,但我不知道对原语采用哪种方法。
【问题讨论】:
如果我在 Java 中的方法中声明一个 int(或任何原始类型),该内存是在函数返回的那一刻被释放,还是必须在垃圾收集器清理它之前一直存在?
我知道在 C 中堆栈指针被重置并立即释放内存,并且我知道 Java 中的对象必须进行垃圾收集,但我不知道对原语采用哪种方法。
【问题讨论】:
当一个方法被返回时,它栈上的变量总是立即被释放(当然,释放是指栈帧被销毁,所有附加到它的内存也像局部变量一样)。
但是,如果该变量是一个对象,那么它的值就是一个指针。包含对象的实际内存(也可能具有指向其他对象的指针)将在堆上。当堆栈上的引用被释放时,该对象只是闲置而没有任何人引用它(除非您将引用放在其他地方)。那是java可能进来并收集垃圾的时候。那就是对象被标记为收集,下次收集器运行时它将清理该对象。
基元有一个原始值,而不是指针。因此,正如其他答案中所述,无需对它们进行 GC。
这非常类似于 C 中的 malloc 和 free。
当你 malloc 一些内存到 C 中的一个变量并且你的函数返回时,该指针的内存被释放,但不是它指向的内存。
当您在 java 中创建一个对象时(可能使用 new 关键字),您正在为它分配内存。但是,您永远不会在 java 中显式调用 free。 JVM 会检测何时需要释放。
您可以将引用设置为 null 以告诉 JVM 您不再需要它,但通常最好只使用最小范围。
【讨论】:
原语在堆栈上分配,因此在函数返回时释放它们的内存。
【讨论】:
是在函数返回的那一刻释放内存,还是在垃圾收集器清理它之前一直存在?
方法内部声明的原语存储在该方法的堆栈帧中。由于方法一返回栈帧就被销毁,分配给局部变量的空间就被释放了。
【讨论】: