相信大家都对java中的JVM的收集器不陌生吧,或许还是有些小伙伴们不是很熟悉,下面就请感兴趣的朋友们一起跟小编来看看吧,JVM的收集器是指什么呢?具体有哪些收集器呢?
JVM中垃圾收集器
Scavenge GC(次收集)和 Full GC的区别(全收集)
新生代GC( Scavenge GC): Scavenge GC指发生在新生代的GC,因为新生代的Java对象大多都是朝生夕死的,所以 Scavenge GC非常频繁,一般回收速度也比较快,当Eden空间不足以为对象分配内存时,会触发 Scavenge GC。
一般情况下,当新对象生成,并且在Eden申请空间失败时,就会触发 Scavenge GC,对Eden区域进行GC,清除非存活对象,并且把尚且存活的对象移动到 Survivor区。然后
整理 Survivor的两个区。这种方式的GC是对年轻代的Eden区进行,不会影向到年老代。
因为大部分对象都是从Eden区开始的,同时Eden区不会分配的很大,所以Eden区的GC
会频繁进行。因而,一般在这里需要使用速度快、效率高的算法,使Eden去能尽快空闲出来。
老年代GC( Full GC/Major GC):Full GC指发生在老年代的GC,出现了 Full GC一般会伴随着至少ー次的 Minor GC(老年代的对象大部分是 Minor GC过程中从新生代进入老年代),比如:分配担保失败。Full GC的速度一般会比 Minor GC慢10倍以上。当老年代内存不足或者显式调用 System.gc()方法时,会触发 Full GC
次收集
当年轻代堆空间紧张时会被触发
相对于全收隻而言,收集间隔较短
全收集
当老年代或者持久代堆空间满了,会触发全收集操作
可以使用 System.gc0方法来显式的启动全收集
全收集一般根据堆大小的不同,需要的时间不尽相同,但一般会比较长。不过,如果全收集时间超过3到5秒钟,那就太长了。
分代垃圾回收器
新生代收集器
串行收集器(Serial)
Serial收集器是 HotSpot运行在 Client模式下的认新生代收集器,它的特点是只用一个
CPU/一条收集线程去完成GC工作,且在进行垃圾收集时必须暂停其他所有的工作线程
(“ Stop The World”-后面简称STW)可以使用-XX+ UseSerilalGC打开。
虽然是单线程收集,但它却简单而高效,在VM管理内存不大的情况下收集几十M~一两百M的新生代,停顿时间完全可以控制在几十毫秒到一百多毫秒内。
并行收集器(ParNew)
Pardew收集器其实是前面 Serial的多线程版本,除使用多条线程进行GC外,包括 Serial可用的所有控制参数、收集算法、STW、对象分配规则、回收策略等都与 Serial完全一样(也是VM启用CMS收集器-XX:+UseConcMarkSweepGC的默认新生代收集器)
由于存在线程切换的开销,ParNev在单CPU的环境中比不上
Serial,且在通过超线程技术实现的两个CPU的环境中也不能100%保证能超越Serial,但随着可用的CPU数量的增加,收集效率肯定也会大大增加
(ParNew收集线程数与CPU的数量相同,因此在CPU数量过大的环境中,可用-XX: ParallelGCThreads=
Parallel Scavenge收集器
与 Pardew类似,Parallel Scavenge也是使用复制算法,也是并行多线程收集器.但与其他收集器关注尽可能缩短垃圾收集时间不同, Parallel Scavenge更关注系统吞吐量,系统吞吐量=运行用户代码时间(运行用户代码时间+垃圾收集时间)停顿时间越短就越适用于用户交互的程序,良好的响应速度能提升用户的体验;而高吞吐量则适用于后台运算而不需要太多交互的任务-可以最高效率地利用CPU时间尽快地完成程序的运算任务, Parallel Scavenge提供了如下参数设置系统吞吐量:
那么以上就是有关JVM的收集器的所有内容了,还想了解更多java常见问答知识,欢迎来关注本站最新消息哦。
推荐阅读: