<commit_before>---
layout: post
title: 《深入理解jvm》读书笔记之——GC收集器
category: 技术
tags: [tech]
keywords: jvm,classloader,gc,garbage collector
description: 《深入理解jvm》读书笔记之——GC收集器
---


## 1、serial收集器    

`serial`是一个单线程的垃圾收集器，它只会使用一个cpu、一个收集线程工作；它在进行gc的时候，必须暂停其他所有线程到它工作结束(这种暂停往往让人难以接受)。         

对于单个cpu的情况下，`serial`是没有线程交互的开销，效率要好于其他。例如在一个简单的桌面应用，只有几十M的内存，他的停顿时间可能只有几十毫秒，所以一般默认的client模式下都是用的`serial`做默认垃圾收集器。     

![serial收集器 ](http://upload-images.jianshu.io/upload_images/584578-aef2c6f30a246b64.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)     

## 2、parnew收集器     

`parnew`其实就是`serial`的多线程版本，`parnew`在单线程的情况下甚至不如`serial`，`parnew`是除了`serial`之外唯一能和CMS配合的。    

`parnew`默认开启收集线程数和cpu的数量相同，我们可以利用`-XX:ParallelGCThreads`参数来控制它开启的收集线程数。    

![parnew收集器](http://upload-images.jianshu.io/upload_images/584578-4115b8ffcde46666.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)    

## 3、parallel scavenge收集器     
 
`parallel scavenge`主要就是关注吞吐量。    
所谓吞吐量：运行用户代码的世界/(运行用户代码时间+GC花费的时间)。    
parallel scavenge收集器中，提供了2个参数来控制吞吐量：    
- `-XX:GCTimeRatio`：gc时间占用的总比例，也就是吞吐量的倒数。           
- `-XX:MaxGCPauseMillis`：最大的暂停毫秒数（这个数值并非越小越好，如果把他设置小了，系统会根据这个值调整空间的大小，也就会加快GC的频率）       

`parallel scavenge`可以设置开启`-XX:UseAdaptiveSizePolicy`，开启这个参数之后就无需关注新生代大小eden和survivor等比例，晋升老年代对象年龄的这些细节了。    

![parallel scavenge的工作细节](http://upload-images.jianshu.io/upload_images/584578-8f8dd83fe549172d.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

## 4、serial old收集器     

serial收集器的老年代版本，使用标记整理算法，主要有两个作用：   
- jdk5之前和parallel scavenge配合使用     
- 作为cms失败的后备收集方案     <commit_msg>new article<commit_after>---
layout: post
title: 《深入理解jvm》读书笔记之——GC收集器
category: 技术
tags: [tech]
keywords: jvm,classloader,gc,garbage collector
description: 《深入理解jvm》读书笔记之——GC收集器
---


## 1、serial收集器    

`serial`是一个单线程的垃圾收集器，它只会使用一个cpu、一个收集线程工作；它在进行gc的时候，必须暂停其他所有线程到它工作结束(这种暂停往往让人难以接受)。         

对于单个cpu的情况下，`serial`是没有线程交互的开销，效率要好于其他。例如在一个简单的桌面应用，只有几十M的内存，他的停顿时间可能只有几十毫秒，所以一般默认的client模式下都是用的`serial`做默认垃圾收集器。     

![serial收集器 ](http://upload-images.jianshu.io/upload_images/584578-aef2c6f30a246b64.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)     

## 2、parnew收集器     

`parnew`其实就是`serial`的多线程版本，`parnew`在单线程的情况下甚至不如`serial`，`parnew`是除了`serial`之外唯一能和CMS配合的。    

`parnew`默认开启收集线程数和cpu的数量相同，我们可以利用`-XX:ParallelGCThreads`参数来控制它开启的收集线程数。    

![parnew收集器](http://upload-images.jianshu.io/upload_images/584578-4115b8ffcde46666.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)    

## 3、parallel scavenge收集器     
 
`parallel scavenge`主要就是关注吞吐量。    
所谓吞吐量：运行用户代码的世界/(运行用户代码时间+GC花费的时间)。    
parallel scavenge收集器中，提供了2个参数来控制吞吐量：    

- `-XX:GCTimeRatio`：gc时间占用的总比例，也就是吞吐量的倒数。           
- `-XX:MaxGCPauseMillis`：最大的暂停毫秒数（这个数值并非越小越好，如果把他设置小了，系统会根据这个值调整空间的大小，也就会加快GC的频率）       

`parallel scavenge`可以设置开启`-XX:UseAdaptiveSizePolicy`，开启这个参数之后就无需关注新生代大小eden和survivor等比例，晋升老年代对象年龄的这些细节了。    

![parallel scavenge的工作细节](http://upload-images.jianshu.io/upload_images/584578-8f8dd83fe549172d.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

## 4、serial old收集器     

serial收集器的老年代版本，使用标记整理算法，主要有两个作用：   

- jdk5之前和parallel scavenge配合使用     
- 作为cms失败的后备收集方案     
{'fraction_non_alphanumeric': 0.12444444444444444, 'fraction_numerical': 0.04888888888888889, 'mean_word_length': 6.002222222222223, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5891748', 'n_tokens_mistral': 2032, 'n_tokens_neox': 2127, 'n_words': 85}