如果我在Java中的方法中声明一个int(或任何基本类型),那么该函数返回时该内存是否释放,或者它必须在垃圾收集器清除它之前一直存在?
我知道在C中,堆栈指针被重置并立即释放内存,我知道Java中的对象必须被垃圾收集,但我不知道基元会采用哪种方法。
答案 0 :(得分:16)
当返回一个方法时,它的堆栈上的变量总是被立即释放(当然,释放后我意味着堆栈帧被破坏,所有与内存变量相关的内存也被破坏)。
但是,如果该变量是一个对象,那么它的值是一个指针。包含该对象的实际内存(也可能包含指向其他对象的指针)将在堆上。当堆栈上的引用被释放时,对象只是坐着而没有任何人引用它(除非你在其他地方放置引用)。那是当java可能进来并且垃圾收集的时候。这就是对象被标记为收集,下次收集器运行它将清理此对象。
原语具有原始值,而不是指针。正如其他答案所述,没有必要对它们进行GC。
这与C中的malloc
和free
非常类似。
当你将一些内存malloc到C中的一个变量并且你的函数返回时,该指针的内存被释放但不是它指向的内存。
当你在java中创建一个对象(可能是new
关键字)时,你正在为它分配内存。但是,您从未在java中显式调用free
。 JVM将检测何时需要执行释放。
您可以将引用设置为null以告诉JVM您不再需要它,但通常最好只使用最小范围。
答案 1 :(得分:13)
基元在堆栈上分配,因此在函数返回时释放它们的内存。
答案 2 :(得分:8)
是函数返回时释放的内存,还是它必须在垃圾收集器清除之前一直闲置?
在方法内声明的基元存储在该方法的堆栈帧中。由于一旦方法返回就会销毁堆栈帧,因此释放分配给局部变量的空间。