【JVM调优】Day01:Garbage的概念、垃圾回收的算法(标记清除、拷贝、标记压缩)、各种垃圾回收器(Serial、Parallel、CMS并发)及存在的问题

〇、前言

简历写上:熟悉GC常用算法,熟悉常见垃圾回收器、具有实际JVM调优实战经验

瞬间涨3k

一、什么是garbage

Java中垃圾回收器自动进行垃圾回收,不用自己回收

new 对象在内存中,c++/c手动删除,而java无需要写代码

判断什么是垃圾:

方法1:有无引用指向--reference count,是有问题的,无法解决循环引用(引用计数在Python中有使用)

方法2:从根上能找到的对象,即从main函数能找到的对象--根可达算法

二、GC算法-找到垃圾如何清除(提出五十多年未变过)

 1、标记清除算法Mark-Sweep

 

缺陷:碎片化现象很严重

2、拷贝算法Copying

无论空间多大,全部空间一分为二

在某一个空间内调用程序,当程序调用结束,选择有用的对象,放到另一半

并将当前部分的那些没有用的对象,全部回收

优势:效率高,一次性清除很大的空间

缺陷:浪费空间,有一半用不了

3、标记整理Mark-Compact

标记的同时,把有用的对象排到前面

一边找,一遍标记,一边整理

三、垃圾回收器Garbage Collector

1、概述图示

用虚线连接,表示两个垃圾回收器有联系,可以配合使用

往往是上下配对

2、最古老的垃圾回收器:Serial-连续的,序列的,单线程的

 

Serial:单线程,Stop-the-world,简称STW,进行垃圾回收的时候,业务线程全部停止

垃圾回收开始干活,java程序变卡

对网站的影响:对用户的反馈不友好,容易出现卡顿现象

调优:STW的时间要短,让用户迅速得到反馈

3、内存变大时,可以多加几个线程-Parallel Scavenge(并行)

线程数量可以增多,但不能无限增多

当内存很多时,进行STW,仍然会浪费很多时间,多线程卡顿时间也会变长

实际1.8生产环境默认:PS+PO

Oracle jdk11收费,Open Jdk免费

调优:可以使用G1(jdk1.9后的默认)

4、Concurrent Mark Sweep,CMS-并发

(1)什么是并发:当垃圾回收线程和正在工作的线程同时开始工作时,叫做并发

一边丢线团,一边清理线程

小线团就是new出来的多个对象

从CMS之后都是并发

(2)存在的问题1

小线团之间会存在关联,过程很乱

 业务线程不断运行,将其标记为不是垃圾,但下一秒就变成垃圾了,不再有引用

而垃圾回收线程从根上寻找时,两个线程在不同的CPU上运行,但垃圾回收却将其标记为有用,不会将其作为垃圾进行回收

会产生浮动垃圾:垃圾在这次回收中没有被清理掉,只能在下次回收

(3)存在的问题2

回收时标记为垃圾

但工作线程将其与现有对象建立连接

被回收后,再去访问,得到的是空值

(4)怎么建立连接-找到没有引用的对象

是算法带来的问题

标记过程分为多个阶段,标记完后会继续--三色标记算法

posted @ 2022-01-10 21:24  哥们要飞  阅读(114)  评论(0编辑  收藏  举报