14

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

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

4

3 回答 3

19

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

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

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

malloc这与freeC语言非常相似。

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

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

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

于 2013-09-11T16:47:47.633 回答
14

Primitives are allocated on the stack, so their memory is freed the moment the function returns.

于 2013-09-11T16:43:04.077 回答
9

is that memory freed the moment the function returns, or does it have to hang around until the garbage collector cleans it?

The primitives declared inside the method are stored on the stack frame of that method. Since the stack frame is destroyed as soon as the method returns, the space allocated to local variables are freed.

于 2013-09-11T16:43:18.380 回答