# 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
```