记一次有关于Jvm垃圾收集器的整理
垃圾回收器
算法:
引用计数法
复制算法
标记清楚
标记整理
垃圾回收的方式
1、Serial:串行回收
2、Parallel:并行回收
3、CMS:并发标记清除
4、G1:G1
截止到java10 之后有ZGC
Seial:串行垃圾回收,单线程垃圾回收的时候会停掉用户的线程进行垃圾回收不适合服务器的环境
Parallel:并行垃圾回收多个垃圾收集线程并行工作也会停掉垃圾回收的时候用户的线程
CMS:用户线程和垃圾回收线程同时执行(不一定是并行,可以是交替执行)不需要暂停用户线程
G1:将堆内存分割成为不同的区域然后对各个区域并发的进行垃圾回收
垃圾收集器(查看默认的垃圾收集器 java -XX:+PrintCommandLineFlags -----> -XX:+UseParallelGC)
7种垃圾收集器(新生代的收集器和老年代的收集器可以互相的激活组合搭配使用及只配置一方就可以默认的选择使用另一方)
新生代
1、Serial收集器:简单高效的最古老的收集器
-XX:+UseSerialGC 配置之后就会启用 新生代:Serial Copying ------ 老年代:Serial CMS(Serial Old) 进行垃圾收集
2、ParNew:并行收集器新生代的收集器在垃圾收集的时候也会暂停应用其实就是serial的并行版本 新生代的默认收集器
-XX:+UserParNewGC 开启后使用 ParNew+Serial CMS(Serial Old)的组合(不推荐组合) 他只会影响新生代不会印象老年代新生代使用Parallel new 并行进行垃圾回收
3、Parallel: 并行垃圾回收
-XX:+UseParallelGC -XX:+UseParallelOldGC 开启后 新生代老年代都会采用并行垃圾回收 (jdk1.8)Parallel Scavenge + Parallel Compacting(Parallel Old)
关注Parallel Scavenge可控的吞吐量,自适应的调节策略动态的调整参数提供最合适的停顿时间(jdk1.6之前之关注新生代的吞吐量使用Parallel Scavenge + Serial Old 的组合)
老年代
1、Parallel Old:并行垃圾回收
-XX:+UseParallelOldGC
2、CMS: 标记清除 算法的实现,是一种获取最短回收收集停顿时间的收集器,并发是指于用户线程一起执行
-XX:+ConcMarkSweepGC 开启之后会自动激活 -XX:+UserParNewGC 使 CMS + Serial Old(后备收集器备用) + ParNew 一起配合的使用
工作的四部
1、初始标记:只是标记一下GC Roots能直接关联的对象,速度很快但仍需要暂停所有的工作线程
2、并发标记:和用户线程一起工作进行GC Roots的跟踪过程,和用户线程一起工作不需要暂停,主要标记过程,标记全部对象
3、重新标记:修正在并发标记期间,因用户线程继续运行,而导致标记产生变动的那一部分对象的标记记录,仍需要暂停所有工作的相乘
由于并发标记时,用户线程依然运行,因此在正式清理前。在做修正。
4、并发清除:和用户线程一起,清除GC Roots 不可达的对象,和用户线程一起工作,不需要暂停工作线程,基于标记的结构直接清理对象
由于耗时最长的并发标记和并发清除过程中,垃圾收集线程,可以和用户线程一起并发工作,所以总体来看CMS收集器的没存回收是和用户线程一起并发执行的
优点:并发收集停顿低 缺点:cpu压力大,标记清除会产生碎片,cms必须要在堆内存用尽之前完成回收
3、Serial Old: Serial 的老年代版本 单线程
-XX:+UseSerialOldGC
不同厂商不同版本的差别很大 这些垃圾收集器为HotSpot中的收集器
新生代:Serial Copying Parallel Scavenge ParNew(Parallel New Gen) G1
老年代:Serial CMS(Serial Old) Parallel Compacting(Parallel old) CMS G1
注:Serial Old 已经不推荐使用了