54 lines
3.0 KiB
Markdown
54 lines
3.0 KiB
Markdown
# 垃圾回收器
|
||
* ## 垃圾回收器分类:
|
||
* 串行垃圾回收器:
|
||
* 单线程情况下使用
|
||
* 吞吐量优先的垃圾回收器:
|
||
* 适合在多线程情况下使用
|
||
* 其会让单位时间内STW时间之和尽可能变短
|
||
* 响应时间优先的垃圾回收器:
|
||
* 同样适用于多核cpu情况
|
||
* 其会尽可能让单次垃圾回的STW时间变短
|
||
* ## 串行垃圾回收器:
|
||
* 开启串行垃圾回收器:
|
||
```java
|
||
// 可以通过指定JVM参数来指定使用串行垃圾回收器
|
||
// 其会使用Serial和Serial Old来作为垃圾回收器
|
||
// Serial:年轻代垃圾回收器(使用复制算法)
|
||
// Serial Old:老年代垃圾回收器(使用标记整理算法)
|
||
-XX:+UseSerialGC
|
||
```
|
||
* 串行垃圾回收器的回收流程:
|
||
* 串行垃圾回收器只有一个垃圾回收的线程,当垃圾回收线程进行垃圾回收时,会暂停所有的用户线程,直到垃圾回收完成后用户线程才继续运行
|
||
* ## 吞吐量优先的垃圾回收器:
|
||
* 开启吞吐量优先的垃圾回收器:
|
||
```java
|
||
// 指定JVM参数-XX:+UseParallelGC可以开启吞吐量优先的垃圾回收器
|
||
// 其是JDK1.8环境下的默认垃圾回收器
|
||
// 其会允许多个垃圾回收线程并行的执行垃圾回收工作
|
||
-XX:+UseParallelGC
|
||
```
|
||
* ## 响应时间优先的垃圾回收器:
|
||
* 响应时间优先的垃圾回收器采用cms垃圾回收其作为老年代垃圾回收器,而使用ParNewGC作为新生代垃圾回收器
|
||
```java
|
||
-XX:+UseConcMarkSweepGC -XX:+UseParNewGC
|
||
```
|
||
* CMS垃圾回收工作流程:
|
||
* 初始标记:此时需要STW,用户线程会暂停
|
||
* 并发标记:并发标记时用户线程不需要暂停
|
||
* 再标记:再标记时用户线程需要暂停,会产生STW
|
||
* 并发清除:此阶段用户线程不会暂停,不需要STW
|
||
* CMS垃圾回收缺点:
|
||
* 在CMS进行并发清除时,并没有STW,其他用户线程在运行时可能会产生垃圾。产生的垃圾在这次垃圾回收时无法被回收,会留给下一次垃圾回收时进行清理。留给下一次垃圾回收进行清理的垃圾称之为浮动垃圾。、
|
||
* CMS垃圾回收器采用的是标记清除算法,在长时间运行后可能会产生内存碎片。在产生内存碎片过多后,CMS会退化为Serial Old垃圾回收器并通过标记整理算法来避免内存碎片过多的情况
|
||
|
||
* ## G1垃圾回收器
|
||
* G1垃圾回收器特性:
|
||
* G1垃圾回收器同时注重了低延时和吞吐量
|
||
* G1垃圾回收器适合与超大堆内存的管理
|
||
* G1垃圾回收器会将对内存划分为多个大小相等的Region,每个Region可以独立作为Eden区、Surivor区或老年代区域
|
||
* G1垃圾回收气整体上采用的是标记整理算法,但是两个Region之间采用的是复制算法
|
||
* G1垃圾回收器的开启操作:
|
||
```java
|
||
// 通过指定JVM参数开启G1垃圾回收器
|
||
-XX:+UseG1GC
|
||
``` |