如果我在Java方法中声明一个int(或任何原始类型),那么它的内存是在函数返回时被释放,还是必须一直等到垃圾回收器清理它?
我知道在C语言中栈指针会被重置并立即释放内存,我也知道Java中的对象必须进行垃圾回收,但我不知道对于原始类型采用哪种方法。
如果我在Java方法中声明一个int(或任何原始类型),那么它的内存是在函数返回时被释放,还是必须一直等到垃圾回收器清理它?
我知道在C语言中栈指针会被重置并立即释放内存,我也知道Java中的对象必须进行垃圾回收,但我不知道对于原始类型采用哪种方法。
当一个方法返回时,其栈上的变量总是立即被释放(当然,所谓的“释放”是指栈帧被销毁,以及与其相关联的所有内存(如局部变量)也被销毁)。
但是,如果该变量是一个对象,则它的值是一个指针。实际包含对象的内存(可能还有指向其他对象的指针)将位于堆上。当栈上的引用被释放时,对象就只是无人引用的闲置物品(除非你把引用放到其他地方)。这时Java可能会进行垃圾回收。也就是说,对象被标记为可回收,下一次垃圾回收器运行时,将清理该对象。
原始类型具有原始值,并且不是指针。因此,如其他答案所述,没有必要对它们进行垃圾回收。
这非常类似于C语言中的malloc
和free
。
在C语言中,当您将一些内存分配给变量并且函数返回时,该指针的内存被释放,但它所指向的内存却没有被释放。
在Java中创建对象(可能使用new
关键字)时,将为其分配内存。但是,在Java中您永远不会显式调用free
。JVM将检测需要进行释放的时机。
您可以将引用设置为null,告诉JVM您不再需要它,但通常最好仅使用最小范围。
原语被分配在堆栈上,因此它们的内存将在函数返回时被释放。
这个内存是在函数返回时被释放的,还是必须等到垃圾收集器清理它?
方法中声明的基本类型数据存储在该方法的堆栈帧中。由于堆栈帧在方法返回时被销毁,因此分配给局部变量的空间将被释放。