15
15
![ ] ( http://upload-images.jianshu.io/upload_images/3985563-1b31d5ebe8dec659.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 )
16
16
17
17
### 2.复制算法
18
- ** 目的:** 为了解决效率问题。
18
+
19
+ ** 目的:** 为了解决效率问题。
19
20
20
21
将可用内存按容量大小划分为大小相等的两块,每次只使用其中的一块。当一块内存使用完了,就将还存活着的对象复制到另一块上面,然后再把已使用过的内存空间一次清理掉。这样使得每次都是对整个半区进行内存回收,内存分配时也就不用考虑内存碎片等复杂情况。
21
22
22
- ** 缺点:** 将内存缩小为了原来的一半。
23
+ ** 缺点:** 将内存缩小为了原来的一半。
23
24
24
25
![ ] ( http://upload-images.jianshu.io/upload_images/3985563-1b7d8f53a44cdfdb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 )
25
26
26
27
现代的商业虚拟机都采用这种收集算法来回收新生代,IBM公司的专门研究表明,新生代中对象98%对象是“朝生夕死”的,所以不需要按照1:1的比例来划分内存空间,而是** 将内存分为较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中一块Survivor。HotSpot虚拟机中默认Eden和Survivor的大小比例是8:1。**
27
28
28
29
### 3.标记-整理算法
30
+
29
31
复制收集算法在对象存活率较高时,就要进行较多的复制操作,效率就会变低。
30
- 根据老年代的特点,提出了”标记-整理“算法。
32
+ 根据老年代的特点,提出了“标记-整理”算法。
33
+
31
34
标记过程仍然与”标记-清除“算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉边界以外的内存。
35
+
32
36
![ ] ( http://upload-images.jianshu.io/upload_images/3985563-1bd60604e0c0f46a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 )
33
37
34
38
### 4.分代收集算法
39
+
35
40
一般是把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。
36
41
37
42
在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法。
38
43
39
44
在老年代中,因为对象存活率高、没有额外空间对它进行分配担保,就必须采用“标记-清除”或“标记-整理”算法来进行回收。
40
45
41
46
## 二、垃圾回收机制的一些知识
47
+
42
48
### 1.JVM中的年代
49
+
43
50
** JVM中分为年轻代(Young generation)和老年代(Tenured generation)** 。
44
51
45
- ** HotSpot JVM把年轻代分为了三部分** :1个Eden区和2个Survivor区(分别叫from和to)。默认比例为8:1, 为啥默认会是这个比例,接下来我们会聊到。
52
+ ** HotSpot JVM把年轻代分为了三部分** :1个Eden区和2个Survivor区(分别叫from和to)。默认比例为8:1, 为啥默认会是这个比例,接下来我们会聊到。
46
53
47
- ** 一般情况下,新创建的对象都会被分配到Eden区** (一些大对象特殊处理), 这些对象经过第一次Minor GC后,如果仍然存活,将会被移到Survivor区。对象在Survivor区中每熬过一次Minor GC,年龄就会增加1岁,当它的年龄增加到一定程度时,就会被移动到年老代中。
54
+ ** 一般情况下,新创建的对象都会被分配到Eden区** (一些大对象特殊处理), 这些对象经过第一次Minor GC后,如果仍然存活,将会被移到Survivor区。对象在Survivor区中每熬过一次Minor GC,年龄就会增加1岁,当它的年龄增加到一定程度时,就会被移动到年老代中。
48
55
因为年轻代中的对象基本都是朝生夕死的(80%以上),所以** 在年轻代的垃圾回收算法使用的是复制算法** ,复制算法的基本思想就是将内存分为两块,每次只用其中一块,当这一块内存用完,就将还活着的对象复制到另外一块上面。复制算法不会产生内存碎片。
49
56
50
57
在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
61
68
以上便是在垃圾回收过程中,需要了解的一些必要的知识。下面我们就来介绍具体的垃圾收集器。
62
69
63
70
## 三、垃圾收集器
71
+
64
72
![ ] ( http://upload-images.jianshu.io/upload_images/3985563-89c627b9a5ed3b52.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 )
73
+
65
74
上图展示了7种作用于不同分代的收集器,如果两个收集器之间存在连线,说明它们可以搭配使用。
75
+
66
76
### 1.Serial收集器
77
+
67
78
是最基本、发展历史最悠久的收集器。这是一个** 单线程收集器** 。但它的“单线程”的意义并不仅仅说明它只会使用一个CPU或一条收集线程去完成垃圾收集工作,更重要的是它在进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束。
68
79
69
80
![ ] ( http://upload-images.jianshu.io/upload_images/3985563-afe8d052d4dcefcb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 )
70
81
71
82
是虚拟机运行在Client模式下的默认新生代收集器。
72
83
73
- ** 优势:** 简单而高效(与其他收集器的单线程比),对于限定单个CPU的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程效率。
84
+ ** 优势:** 简单而高效(与其他收集器的单线程比),对于限定单个CPU的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程效率。
74
85
75
86
### 2.ParNew收集器
76
87
ParNew收集器其实就是Serial收集器的多线程版本。
@@ -85,7 +96,7 @@ ParNew收集器默认开启的收集线程数与CPU的数量相同。
85
96
### 3.Parallel Scavenge收集器
86
97
Parallel Scavenge收集器是一个新生代收集器,使用复制算法,又是并行的多线程收集器。
87
98
88
- ** 最大的特点是:** Parallel Scavenge收集器的目标是达到一个可控制的吞吐量。
99
+ ** 最大的特点是:** Parallel Scavenge收集器的目标是达到一个可控制的吞吐量。
89
100
90
101
** 所谓吞吐量就是CPU用于运行用户代码的时间与CPU总消耗时间的比值** ,即吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)。
91
102
@@ -108,7 +119,7 @@ Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和
108
119
### 6.CMS(Concurrent Mark Sweep)收集器
109
120
** 是HotSpot虚拟机中第一款真正意义上的并发收集器,它第一次实现了让垃圾收集线程与用户线程同时工作。**
110
121
111
- ** 关注点:** 尽可能地缩短垃圾收集时用户线程的停顿时间。
122
+ ** 关注点:** 尽可能地缩短垃圾收集时用户线程的停顿时间。
112
123
113
124
CMS收集器是基于“标记-清除”算法实现的,** 整个过程分为4个步骤** :
114
125
@@ -127,6 +138,7 @@ CMS收集器是基于“标记-清除”算法实现的,**整个过程分为4
127
138
整个过程耗时最长的阶段是并发标记,并发清除过程,但这两个过程可以和用户线程一起工作。
128
139
129
140
![ ] ( http://upload-images.jianshu.io/upload_images/3985563-e2e96b26402033da.jpeg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 )
141
+
130
142
** 缺点:**
131
143
132
144
①CMS收集器对CPU资源非常敏感。在并发阶段,它虽然不会导致用户线程停顿,但是会因为占用了一部分线程(或者说CPU资源)而导致应用程序变慢,总吞吐量会降低。
@@ -135,7 +147,9 @@ CMS收集器是基于“标记-清除”算法实现的,**整个过程分为4
135
147
136
148
③CMS是一款基于“标记-清除”算法实现的收集器,所以会有大量空间碎片问题。
137
149
### 7.G1收集器
150
+
138
151
是当今收集器技术发展的最前沿成果之一。是一款面向服务端应用的垃圾收集器。
152
+
139
153
** 特点:**
140
154
141
155
** ①并行与并发**
0 commit comments