JAVA基础——JVM之垃圾回收器

JVM 垃圾回收器

​ 在 JVM 中,垃圾回收器大体分为三个种类:串行垃圾回收器、吞吐量优先的垃圾回收器和响应时间优先的垃圾回收器

串行垃圾回收器

​ 串行垃圾回收器是一种单线程的垃圾回收器,适合堆内存小,cpu 个数少的电脑

​ 开启:-XX:+UseSerialGC = Serial + SerialOld

​ 串行垃圾回收器分为两个部分:Serial 和 SerialOld,Serial 工作在新生代,使用的垃圾回收算法是复制算法,SerialOld 工作在老年代,使用标记整理算法

​ 当串行垃圾回收器进行垃圾回收时,所有的用户线程将会暂停,因为垃圾回收的过程中会涉及到地址的变化,当所有线程运行到一个本身的安全点时会进入阻塞状态,等待垃圾回收线程结束后,再恢复运行

在这里插入图片描述

吞吐量优先的垃圾回收器

​ 吞吐量优先的垃圾回收器是一种多线程,并行的垃圾回收器

​ 开启:+UseParallelGC~-XX:+UseParallelOldGC

​ 吞吐量优先的垃圾回收器也分为两个部分:Parallel 和 ParallelOld,Parallel 工作在新生代,使用复制算法,ParallelOld 工作在老年代,使用标记整理算法,两个垃圾回收器都是多线程的垃圾回收器,开启一个的同时会默认开启另一个

​ 当需要进行垃圾回收时,所有线程会到安全点时停下,转换为阻塞状态,之后垃圾回收器会开启多个线程进行垃圾回收,其线程个数一般情况下和 cpu 核数相同,回收结束后,各线程再恢复运行,垃圾回收时,cpu 的利用率会达到 100 %

在这里插入图片描述

​ 可以通过参数来设置垃圾回收中的属性:

​ · -XX:+UseAdaptiveSizePolicy
​ -XX:GCTimeRatio = ratio 设置垃圾回收时间占总时间的百分比小于 1 / 1 + ratio,ratio 一般设置成 19
​ -XX:MaxGCPauseMillis = time 最大暂停毫秒数 < time ms,可能和前一项冲突、对立

响应时间优先的垃圾回收器

​ 响应时间优先的垃圾回收器是一种多线程,并发的垃圾回收器,用户线程和垃圾回收线程可以同时进行,一起抢占 cpu 资源

​ 开启:-XX:+UseConcMarkSweepGC-XX:+UseParNewGCSerialOl

​ ConcMarkSweep 是工作在老年代的垃圾回收器,与之配套使用的是工作在新生代的 ParNew,ParNew 是一种基于复制算法的垃圾回收器,ConcMarkSweep 是并发的,基于标记清除算法的垃圾回收器,但是它可能会并发失败,这是它会退化为 SerialOld

​ 当老年代发生垃圾回收时,所有线程会在运行到安全点时暂停并进入阻塞状态,需要进行垃圾回收的线程会进行一次初始标记,初始标记时间很快,只标记一些根对象,接着用户的其他线程便恢复运行,垃圾回收线程与此同时也会并发执行,再一次进行更细致的标记,结束后,会造成第二次 STW,这时对所有的线程进行一次重新标记,以避免并发运行期间,新的内存使用对垃圾回收产生影响,重新标记结束后,垃圾回收线程开始进行清理,用户线程也都恢复运行,这时也是垃圾回收线程和用户线程并发运行,这种垃圾回收方式对系统吞吐量是有影响的,因为用于计算的 cpu 个数降低了

​ 由于这种垃圾回收方式不会保证清除掉所有垃圾,所以不能像以上的两种垃圾回收器那样,等内存占用满时再进行垃圾回收,会在内存占比达到一定比例时便进行垃圾回收

在这里插入图片描述

发布了38 篇原创文章 · 获赞 44 · 访问量 3417

猜你喜欢

转载自blog.csdn.net/scfor333/article/details/103746253