Skip to content

Commit

Permalink
docs: update gc algorithms diagrams (#35)
Browse files Browse the repository at this point in the history
  • Loading branch information
kenny authored May 25, 2023
1 parent f5cebd6 commit 27eab34
Show file tree
Hide file tree
Showing 5 changed files with 12 additions and 0 deletions.
12 changes: 12 additions & 0 deletions docs/03-gc-algorithms.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,10 @@ GC Roots 并不包括堆中对象所引用的对象,这样就不会有循环

### 判定 finalize() 是否有必要执行

![](https://cdn-doocs.oss-cn-shenzhen.aliyuncs.com/gh/doocs/jvm@main/images/finalize-method-process.jpg)



JVM 会判断此对象是否有必要执行 finalize() 方法,如果对象没有覆盖 finalize() 方法,或者 finalize() 方法已经被虚拟机调用过,那么视为“没有必要执行”。那么对象基本上就真的被回收了。

如果对象被判定为有必要执行 finalize() 方法,那么对象会被放入一个 F-Queue 队列中,虚拟机会以较低的优先级执行这些 finalize()方法,但不会确保所有的 finalize() 方法都会执行结束。如果 finalize() 方法出现耗时操作,虚拟机就直接停止指向该方法,将对象清除。
Expand All @@ -67,6 +71,8 @@ JVM 会判断此对象是否有必要执行 finalize() 方法,如果对象没

> 任何一个对象的 finalize() 方法只会被系统自动调用一次,如果对象面临下一次回收,它的 finalize() 方法不会被再次执行,想继续在 finalize() 中自救就失效了。


## 回收方法区内存

方法区中存放生命周期较长的类信息、常量、静态变量,每次垃圾收集只有少量的垃圾被清除。方法区中主要清除两种垃圾:
Expand Down Expand Up @@ -94,6 +100,8 @@ JVM 会判断此对象是否有必要执行 finalize() 方法,如果对象没

### 标记-清除算法

![](https://cdn-doocs.oss-cn-shenzhen.aliyuncs.com/gh/doocs/jvm@main/images/mark-and-sweep.jpg)

**标记**的过程是:遍历所有的 `GC Roots`,然后将所有 `GC Roots` 可达的对象**标记为存活的对象**

**清除**的过程将遍历堆中所有的对象,将没有标记的对象全部清除掉。与此同时,清除那些被标记过的对象的标记,以便下次的垃圾回收。
Expand All @@ -105,6 +113,8 @@ JVM 会判断此对象是否有必要执行 finalize() 方法,如果对象没

### 复制算法(新生代)

![](https://cdn-doocs.oss-cn-shenzhen.aliyuncs.com/gh/doocs/jvm@main/images/mark-and-copy.jpg)

为了解决效率问题,“复制”收集算法出现了。它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块内存用完,需要进行垃圾收集时,就将存活者的对象复制到另一块上面,然后将第一块内存全部清除。这种算法有优有劣:

- 优点:不会有内存碎片的问题。
Expand All @@ -120,6 +130,8 @@ JVM 会判断此对象是否有必要执行 finalize() 方法,如果对象没

### 标记-整理算法(老年代)

![](https://cdn-doocs.oss-cn-shenzhen.aliyuncs.com/gh/doocs/jvm@main/images/mark-and-compact.jpg)

**标记**:它的第一个阶段与**标记-清除算法**是一模一样的,均是遍历 `GC Roots`,然后将存活的对象标记。

**整理**:移动所有**存活的对象**,且按照内存地址次序依次排列,然后将末端内存地址以后的内存全部回收。因此,第二阶段才称为整理阶段。
Expand Down
Binary file added images/finalize-method-process.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/mark-and-compact.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/mark-and-copy.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/mark-and-sweep.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 27eab34

Please sign in to comment.