java - Java 基元是否被垃圾收集

标签 java garbage-collection

如果我在 Java 中的方法中声明一个 int(或任何基本类型),该内存是在函数返回时释放的,还是必须一直挂起直到垃圾收集器清理它?

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

最佳答案

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

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

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

这非常类似于 C 中的 mallocfree

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

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

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

关于java - Java 基元是否被垃圾收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18746801/

相关文章:

java - hibernate/Java : retrieving primary key always returns zero

java - Java和C之间的浮点类型有什么区别吗?

garbage-collection - 如何在没有 gc 的情况下实现闭包?

c# - ASP.NET 垃圾回收 : is referencing static class property dangerous?

garbage-collection - 如何在 Hg 中 "GC"或 "strip"隐藏进化变更集?

java - 在我的示例中如何模拟具有静态字段的类?

java - 如何找到java.rmi包的jar

Java SAX 解析器 - 解析 int 时出现 NumberFormatException

Java:重复调用函数时性能提升的原因是什么?

Java -Xnoclassgc