Java基本类型是否进行垃圾回收?

16

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

我知道在C语言中栈指针会被重置并立即释放内存,我也知道Java中的对象必须进行垃圾回收,但我不知道对于原始类型采用哪种方法。

3个回答

22

当一个方法返回时,其栈上的变量总是立即被释放(当然,所谓的“释放”是指栈帧被销毁,以及与其相关联的所有内存(如局部变量)也被销毁)。

但是,如果该变量是一个对象,则它的值是一个指针。实际包含对象的内存(可能还有指向其他对象的指针)将位于堆上。当栈上的引用被释放时,对象就只是无人引用的闲置物品(除非你把引用放到其他地方)。这时Java可能会进行垃圾回收。也就是说,对象被标记为可回收,下一次垃圾回收器运行时,将清理该对象。

原始类型具有原始值,并且不是指针。因此,如其他答案所述,没有必要对它们进行垃圾回收。

这非常类似于C语言中的mallocfree

在C语言中,当您将一些内存分配给变量并且函数返回时,该指针的内存被释放,但它所指向的内存却没有被释放。

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

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


14

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


3
不是问题的一部分,但对象的原始字段呢? - user395760
4
原始类型的字段(和所有字段一样)将与对象一起存储在堆上。 - Cruncher

9

这个内存是在函数返回时被释放的,还是必须等到垃圾收集器清理它?

方法中声明的基本类型数据存储在该方法的堆栈帧中。由于堆栈帧在方法返回时被销毁,因此分配给局部变量的空间将被释放。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接