是java原始垃圾收集

时间:2013-09-11 16:41:17

标签: java garbage-collection

如果我在Java中的方法中声明一个int(或任何基本类型),那么该函数返回时该内存是否释放,或者它必须在垃圾收集器清除它之前一直存在?

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

3 个答案:

答案 0 :(得分:16)

当返回一个方法时,它的堆栈上的变量总是被立即释放(当然,释放后我意味着堆栈帧被破坏,所有与内存变量相关的内存也被破坏)。

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

原语具有原始值,而不是指针。正如其他答案所述,没有必要对它们进行GC。

这与C中的mallocfree非常类似。

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

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

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

答案 1 :(得分:13)

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

答案 2 :(得分:8)

  

是函数返回时释放的内存,还是它必须在垃圾收集器清除之前一直闲置?

在方法内声明的基元存储在该方法的堆栈帧中。由于一旦方法返回就会销毁堆栈帧,因此释放分配给局部变量的空间。