JVM–垃圾回收器的相关知识点汇总
1.串行垃圾回收器
从标题我们就可以知道,所谓的串行就是指我们的这个垃圾回收器是单线程的
所谓的单线程就是指当用户到达安全点后,垃圾回收进程进行,此时用户进程会被阻塞,只有垃圾回收线程会运行。
因此串行垃圾回收适用于内存较小,cpu数目较小的,如个人电脑
下面是相关的运行简图
吞吐量优先垃圾回收器
特点:
多线程
适用场景:堆内存较大,多核
注重单位时间内,STW的时间最短
打个比方就是吞吐量要求我们在1分钟内STW次数少,这样数据的吞吐量就占用的比例就会比较大
-XX:+UseParallelGC ~ -XX:+UseParallelOldGC
并行垃圾回收(只要开启其中一个,另外一个也会开启)
-XX:+UseAdaptiveSizePolicy
采用自适应的调整新生代的大小
-XX:GCTimeRatio=ratio
吞吐量的目标 调整垃圾回收的时间和总时间的占比 1/1+ratio 垃圾回收的时间(暂停时间) 不能超过此值
-XX:MaxGCPauseMillis=ms 默认值为200ms
-XX:ParallelGCThreads=n 控制cpu的数目
响应时间优先(老年代的垃圾回收器)
特点:
多线程
使用场景:堆内存较大,多核cpu,尽可能让单次STW的时间最短
我们可以这样理解吞吐量垃圾回收器于响应时间优先回收器的侧重点:
打个比方,吞吐量就是你一天内用来玩的次数比较少,但是你每次玩的时间比较多(我就喜欢这种)
而响应时间优先可以认为你每天玩的次数比较多,但是你每次玩的时间比较少。
在这里我们先解释一下并发与并行的区别:
并发:垃圾回收线程和用户的其他的线程同时进行
并行:垃圾回收线程是同时进行的,但是不允许用户的其他线程进行
我们在老年代运用的垃圾清理算法是:标记清除或整理算法
从运行图中我们可以发现几个问题:
- 在并发清理的过程中,其他的用户线程仍然在运行,则会导致产生新的垃圾,我们将此记为浮动垃圾,那么我们该如何清除这些浮动垃圾呢?当然你也可以选择等下一次垃圾回收的时候再清除,就像你洗碗的时候,又有人给你一个碗(或者你当助教作业快改完了,又有人交作业,你可以选择下次再改)那么,作为负责任的助教(像我一样),我们该如何处理呢?
-XX:CMSInitiatingOccupancyFraction=percent 为那些浮动垃圾设置的CMS的触发时机,这个是我们自己设置的。就相当于一个人交了作业我下次再改,但是我想要是再有10个人交,我就不等下次了。 - 减小重新标记的压力
-XX:+CMSScavengeBeforeRemark//用于在重新标记之前将新生代的垃圾回收 减轻我们重新标记的压力
存在的问题:若内存碎片过多,会导致CMS变化为SerialOld,这时垃圾回收的时间会大大增加
在此特别感谢B站各位Up主的无私奉献