是 Java 原语垃圾回收



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

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

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

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

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

这与 C 语言中的mallocfree非常相似。

当您将一些内存错误地插入 C 中的变量并且您的函数返回时,该指针的内存将被释放,但不会释放它指向的内存。

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

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

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

该内存是在函数返回的那一刻释放的,还是必须一直挂在垃圾回收器清理它之前?

在方法中声明的基元存储在该方法的堆栈帧上。由于堆栈帧在方法返回后立即销毁,因此分配给局部变量的空间将被释放。

最新更新