🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# Java 中的垃圾收集 > 原文: [https://beginnersbook.com/2013/04/java-garbage-collection/](https://beginnersbook.com/2013/04/java-garbage-collection/) 当 JVM 启动时,它会创建一个堆区域,称为运行时数据区域。这是存储所有对象(类的实例)的地方。由于该区域有限,因此需要通过移除不再使用的对象来有效地管理该区域。从堆内存中删除未使用的对象的过程称为**垃圾收集**,这是 Java 中内存管理的一部分。 像 C/C++ **这样的语言没有**支持自动垃圾收集,但是在 java 中,垃圾收集是自动的。 现在我们知道 java 中的垃圾收集是自动的。让我们看看 java 何时执行垃圾收集。 ## 什么时候 java 执行垃圾收集? **1.当对象不再可达时:** ```java BeginnersBook obj = new BeginnersBook(); obj = null; ``` 这里引用`obj`指向类`BeginnersBook`的对象,但由于我们为它分配了一个空值,因此它不再指向该对象,这使得`BeginnersBook`对象无法访问,因此无法使用。这些对象可自动用于 Java 中的垃圾收集。 另一个例子是: ```java char[] sayhello = { 'h', 'e', 'l', 'l', 'o'}; String str = new String(sayhello); str = null; ``` 这里`String`类的引用`str`指向堆内存中的字符串`"hello"`,但由于我们已将空值赋给`str`,因此堆内存中存在的对象`"hello"`不可用。 **2.将一个引用复制到另一个引用时:** ```java BeginnersBook obj1 = new BeginnersBook(); BeginnersBook obj2 = new BeginnersBook(); obj2 = obj1; ``` 这里我们已经将引用`obj1`分配给`obj2`,这意味着`obj2`指向的(引用)实例(对象)不可访问并且可用于垃圾收集。 ## 如何请求 JVM 进行垃圾回收 我们现在知道无法访问和不可用的对象可用于垃圾收集,但垃圾收集过程不会立即发生。这意味着一旦对象准备好进行垃圾回收,他们就必须等待 JVM 运行执行垃圾收集的内存清理程序。但是,您可以通过调用`System.gc()`方法请求 JVM 进行垃圾回收(请参阅下面的示例)。 ### Java 中的垃圾收集示例 在这个例子中,我们通过调用`System.gc()`来演示垃圾收集。在这段代码中,我们[重载](https://beginnersbook.com/2014/01/method-overriding-in-java-with-example/)了一个`finalize()`方法。在 Java 垃圾收集过程销毁对象之前调用此方法。这就是您在输出中看到此方法已被调用两次的原因。 ```java public class JavaExample{ public static void main(String args[]){ /* Here we are intentionally assigning a null * value to a reference so that the object becomes * non reachable */ JavaExample obj=new JavaExample(); obj=null; /* Here we are intentionally assigning reference a * to the another reference b to make the object referenced * by b unusable. */ JavaExample a = new JavaExample(); JavaExample b = new JavaExample(); b = a; System.gc(); } protected void finalize() throws Throwable { System.out.println("Garbage collection is performed by JVM"); } } ``` 输出: ```java Garbage collection is performed by JVM Garbage collection is performed by JVM ```