freeCodeCamp/guide/chinese/java/garbage-collection/index.md

108 lines
4.5 KiB
Markdown
Raw Normal View History

---
title: Garbage Collection
localeTitle: 垃圾收集
---
# Java中的垃圾收集
在像C / C ++这样的语言中,程序员有责任创建和销毁对象。但是如果程序员没有履行职责,则可能无法为创建新对象提供足够的内存,程序可能会终止导致**OutOfMemoryErrors** 。
Java使程序员免于内存管理任务并且自己回收不再使用的对象所占用的内存。 java中的垃圾收集由名为**Garbage Collector**的守护程序线程执行。当新对象缺少内存(堆)时, **JVMJava虚拟机会**调用它。
## 当一个对象有资格进行垃圾收集?
* 如果无法从任何活动线程或任何静态引用访问对象,则该对象符合垃圾收集条件。
* 如果对象的所有引用都为null则该对象符合Garbage Collection的条件。
```java
Integer n = new Integer();
n = null; //the Integer object is no longer accessible
```
* 循环依赖不计为引用因此如果对象X具有对象Y的引用而对象Y具有对象X的引用并且它们没有任何其他实时引用则对象X和Y都将有资格进行垃圾收集。
## 如何手动使对象符合垃圾收集条件?
* 尽管程序员不是要销毁对象的任务但在使用它之后使对象无法访问因此符合GC条件是一种很好的编程习惯。
* 通常有四种不同的方法可以使对象符合垃圾回收的条件。
1. 取消引用变量
2. 重新分配参考变量
3. 对象在块内创建,一旦控制退出该块,引用就会超出范围。
4. [隔离岛](http://www.geeksforgeeks.org/island-of-isolation-in-java/)
## 请求JVM运行垃圾收集器1的方
* 尽管使对象符合垃圾收集条件但它依赖于JVM自行决定运行垃圾收集器来销毁垃圾收集器。
* 我们也可以请求JVM运行垃圾收集器。有两种方法可以做到
1. 使用_**System.gc**_方法System类包含静态方法gc用于请求JVM运行Garbage Collector。
2. 使用_**Runtime.getRuntime。gc**_方法运行时类允许应用程序与运行应用程序的JVM进行交互。因此通过使用其gc方法我们可以请求JVM运行垃圾收集器。
```java
// Java program to request
// JVM to run Garbage Collector
public class Test
{
public static void main(String[] args) throws InterruptedException
{
Test test1 = new Test();
Test test2 = new Test();
// Nullifying the reference variable
test1 = null;
// requesting JVM for running Garbage Collector
System.gc();
// Nullifying the reference variable
test2 = null;
// requesting JVM for running Garbage Collector
Runtime.getRuntime().gc();
}
@Override
// finalize method is a method which is called on object once
// before garbage collector is destroying it and reclaiming its memory
protected void finalize() throws Throwable
{
System.out.println("Garbage collector is called");
System.out.println("Object garbage collected : " + this);
}
}
```
```java
OUTPUT -
Garbage collector called
Object garbage collected : Test@46d08f12
Garbage collector called
Object garbage collected : Test@481779b8
```
注意
1. 无法保证上述两种方法中的任何一种都能运行垃圾收集器。
2. 调用System.gc实际上等同于调用Runtime.getRuntime。gc
## 对象终结
* 对象具有与其关联的资源。他们有责任释放资源。
* finalize在Object类中声明并且在销毁对象之前由垃圾收集器调用一次。在垃圾收集器回收其区域之前对象可以使用此方法jst进行任何最后操作。
* finalize方法存在于Object类中具有以下原型。
```java
protected void finalize() throws Throwable
```
## 注1
1. 垃圾收集器调用的finalize方法而不是JVM。虽然垃圾收集器是JVM的模块之一。
2. 对象类finalize方法具有空实现因此建议覆盖finalize方法以处置系统资源或执行其他清理。
3. 对于任何给定对象finalize方法永远不会被多次调用。
4. 如果finalize方法抛出未捕获的异常则忽略该异常并终止该对象的终止。
### 来源
1. [geeksforgeeks。](http://www.geeksforgeeks.org/garbage-collection-java/)访问时间2017年10月24日。