Skip to content

Commit 8331eb4

Browse files
committed
调整JVM中垃圾收集算法及垃圾收集器详解文章中的编辑细节
1 parent 15b5fe4 commit 8331eb4

File tree

1 file changed

+22
-8
lines changed

1 file changed

+22
-8
lines changed

java/virtual-machine/Garbage-Collector.md

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,36 +15,43 @@
1515
![](http://upload-images.jianshu.io/upload_images/3985563-1b31d5ebe8dec659.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
1616

1717
### 2.复制算法
18-
**目的:**为了解决效率问题。
18+
19+
**目的:** 为了解决效率问题。
1920

2021
将可用内存按容量大小划分为大小相等的两块,每次只使用其中的一块。当一块内存使用完了,就将还存活着的对象复制到另一块上面,然后再把已使用过的内存空间一次清理掉。这样使得每次都是对整个半区进行内存回收,内存分配时也就不用考虑内存碎片等复杂情况。
2122

22-
**缺点:**将内存缩小为了原来的一半。
23+
**缺点:** 将内存缩小为了原来的一半。
2324

2425
![](http://upload-images.jianshu.io/upload_images/3985563-1b7d8f53a44cdfdb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
2526

2627
现代的商业虚拟机都采用这种收集算法来回收新生代,IBM公司的专门研究表明,新生代中对象98%对象是“朝生夕死”的,所以不需要按照1:1的比例来划分内存空间,而是**将内存分为较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中一块Survivor。HotSpot虚拟机中默认Eden和Survivor的大小比例是8:1。**
2728

2829
### 3.标记-整理算法
30+
2931
复制收集算法在对象存活率较高时,就要进行较多的复制操作,效率就会变低。
30-
根据老年代的特点,提出了”标记-整理“算法。
32+
根据老年代的特点,提出了“标记-整理”算法。
33+
3134
标记过程仍然与”标记-清除“算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉边界以外的内存。
35+
3236
![](http://upload-images.jianshu.io/upload_images/3985563-1bd60604e0c0f46a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
3337

3438
### 4.分代收集算法
39+
3540
一般是把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。
3641

3742
在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法。
3843

3944
在老年代中,因为对象存活率高、没有额外空间对它进行分配担保,就必须采用“标记-清除”或“标记-整理”算法来进行回收。
4045

4146
## 二、垃圾回收机制的一些知识
47+
4248
### 1.JVM中的年代
49+
4350
**JVM中分为年轻代(Young generation)和老年代(Tenured generation)**
4451

45-
**HotSpot JVM把年轻代分为了三部分**:1个Eden区和2个Survivor区(分别叫from和to)。默认比例为8:1,为啥默认会是这个比例,接下来我们会聊到。
52+
**HotSpot JVM把年轻代分为了三部分**:1个Eden区和2个Survivor区(分别叫from和to)。默认比例为8:1为啥默认会是这个比例,接下来我们会聊到。
4653

47-
**一般情况下,新创建的对象都会被分配到Eden区**(一些大对象特殊处理),这些对象经过第一次Minor GC后,如果仍然存活,将会被移到Survivor区。对象在Survivor区中每熬过一次Minor GC,年龄就会增加1岁,当它的年龄增加到一定程度时,就会被移动到年老代中。
54+
**一般情况下,新创建的对象都会被分配到Eden区**(一些大对象特殊处理)这些对象经过第一次Minor GC后,如果仍然存活,将会被移到Survivor区。对象在Survivor区中每熬过一次Minor GC,年龄就会增加1岁,当它的年龄增加到一定程度时,就会被移动到年老代中。
4855
因为年轻代中的对象基本都是朝生夕死的(80%以上),所以**在年轻代的垃圾回收算法使用的是复制算法**,复制算法的基本思想就是将内存分为两块,每次只用其中一块,当这一块内存用完,就将还活着的对象复制到另外一块上面。复制算法不会产生内存碎片。
4956

5057
在GC开始的时候,对象只会存在于Eden区和名为“From”的Survivor区,Survivor区“To”是空的。紧接着进行GC,Eden区中所有存活的对象都会被复制到“To”,而在“From”区中,仍存活的对象会根据他们的年龄值来决定去向。年龄达到一定值(年龄阈值,可以通过-XX:MaxTenuringThreshold来设置)的对象会被移动到年老代中,没有达到阈值的对象会被复制到“To”区域。经过这次GC后,Eden区和From区已经被清空。这个时候,“From”和“To”会交换他们的角色,也就是新的“To”就是上次GC前的“From”,新的“From”就是上次GC前的“To”。不管怎样,都会保证名为To的Survivor区域是空的。Minor GC会一直重复这样的过程,直到“To”区被填满,“To”区被填满之后,会将所有对象移动到年老代中。
@@ -61,16 +68,20 @@ Full GC/Major GC:指发生在老年代的垃圾收集动作,出现了Major GC
6168
以上便是在垃圾回收过程中,需要了解的一些必要的知识。下面我们就来介绍具体的垃圾收集器。
6269

6370
## 三、垃圾收集器
71+
6472
![](http://upload-images.jianshu.io/upload_images/3985563-89c627b9a5ed3b52.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
73+
6574
上图展示了7种作用于不同分代的收集器,如果两个收集器之间存在连线,说明它们可以搭配使用。
75+
6676
### 1.Serial收集器
77+
6778
 是最基本、发展历史最悠久的收集器。这是一个**单线程收集器**。但它的“单线程”的意义并不仅仅说明它只会使用一个CPU或一条收集线程去完成垃圾收集工作,更重要的是它在进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束。
6879

6980
![](http://upload-images.jianshu.io/upload_images/3985563-afe8d052d4dcefcb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
7081

7182
是虚拟机运行在Client模式下的默认新生代收集器。
7283

73-
**优势:**简单而高效(与其他收集器的单线程比),对于限定单个CPU的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程效率。
84+
**优势:** 简单而高效(与其他收集器的单线程比),对于限定单个CPU的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程效率。
7485

7586
### 2.ParNew收集器
7687
ParNew收集器其实就是Serial收集器的多线程版本。
@@ -85,7 +96,7 @@ ParNew收集器默认开启的收集线程数与CPU的数量相同。
8596
### 3.Parallel Scavenge收集器
8697
Parallel Scavenge收集器是一个新生代收集器,使用复制算法,又是并行的多线程收集器。
8798

88-
**最大的特点是:**Parallel Scavenge收集器的目标是达到一个可控制的吞吐量。
99+
**最大的特点是:** Parallel Scavenge收集器的目标是达到一个可控制的吞吐量。
89100

90101
**所谓吞吐量就是CPU用于运行用户代码的时间与CPU总消耗时间的比值**,即吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)。
91102

@@ -108,7 +119,7 @@ Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和
108119
### 6.CMS(Concurrent Mark Sweep)收集器
109120
**是HotSpot虚拟机中第一款真正意义上的并发收集器,它第一次实现了让垃圾收集线程与用户线程同时工作。**
110121

111-
**关注点:**尽可能地缩短垃圾收集时用户线程的停顿时间。
122+
**关注点:** 尽可能地缩短垃圾收集时用户线程的停顿时间。
112123

113124
CMS收集器是基于“标记-清除”算法实现的,**整个过程分为4个步骤**
114125

@@ -127,6 +138,7 @@ CMS收集器是基于“标记-清除”算法实现的,**整个过程分为4
127138
整个过程耗时最长的阶段是并发标记,并发清除过程,但这两个过程可以和用户线程一起工作。
128139

129140
![](http://upload-images.jianshu.io/upload_images/3985563-e2e96b26402033da.jpeg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
141+
130142
**缺点:**
131143

132144
①CMS收集器对CPU资源非常敏感。在并发阶段,它虽然不会导致用户线程停顿,但是会因为占用了一部分线程(或者说CPU资源)而导致应用程序变慢,总吞吐量会降低。
@@ -135,7 +147,9 @@ CMS收集器是基于“标记-清除”算法实现的,**整个过程分为4
135147

136148
③CMS是一款基于“标记-清除”算法实现的收集器,所以会有大量空间碎片问题。
137149
### 7.G1收集器
150+
138151
是当今收集器技术发展的最前沿成果之一。是一款面向服务端应用的垃圾收集器。
152+
139153
**特点:**
140154

141155
**①并行与并发**

0 commit comments

Comments
 (0)