java jvm 垃圾收集器

来源:互联网 发布:电脑淘宝直播入口在哪 编辑:程序博客网 时间:2024/05/07 09:24

前面讲了垃圾收集算法,这次就来讲一个具体实现

serial收集器

这个收集器是历史最悠久的一个收集器,曾经是新生代的唯一一个选择,因为上一篇说过了,在jvm中垃圾收集算法都是用来搭配使用的,对于不同的情况选择不同的垃圾收集法以达到最优。这个垃圾收集器是一个单线程的收集器,并不仅仅说明它只会使用一个cpu或一条线程去完成工作,而更重要 的时候 当它进行垃圾收集工作时,必须暂停其他所有的工作线程,直到它工作结束 。可想而知,要是你的电脑 运行一小时就停那里5分钟 这可怎么玩,但它存在自有它存在的原因,正是因为它的简单而高效,对于限定单个cpu的环境来说,serial收集器由于没有线程交互,自然可以做到最高效率。所以serial收集器对于 运行在client模式下是一个很好的选择。

parnew收集器

这个就是Serial收集器的多线程版本,它是运行在server模式下的首选 新生代收集器,除了serial收集器之外,目前只有它能与CMS收集器配合工作。CMS收集器是一个被认为具有划时代意义的并发垃圾器,因此如果有一个垃圾器能和它一起搭配使用让其更加完美,那这个收集器必然也是一个不可或缺的部分了。

parallel scavenge收集器

它是一个新生代收集器,是使用复制算法进行回收的,算法见上一篇哈。也是并行的多线程收集器,那么它和上面的收集器又有什么 不同呢,parallel scavenge收集器的目标的达到一个可控制吞吐量的收集器,所谓吞吐量就是cpu运行用户代码 的时间与cpu总消耗时间 的比值 。即吞吐量=运行用户 代码时间 /(运行用户 代码时间+垃圾收集时间 )。此收集器不但可以设置 最大垃圾停留时间 和吞吐量大小,还有一个开头,打开后垃圾收集将根据当前系统的运行状态自动调节 ,这种方式称为GC自适应调节 策略。如果手工优化存在困难的时候 那么就可以直接交给虚拟机去完成 。

serial old 收集器

看名字就知道这是serial收集器老年代版本,这个收集器也是用于Client模式下的虚拟机,第一大用途是和parallel scavenge收集器做搭档,第二大用途是作为CMS收集器的后备预案。

parallel old收集器

同样,这也是parallel scavenge的老年代版本,它的产生有一原因 是当新生代选择了parallel scavenge收集器后,老年代除了serial old收集器外没有别的选择了。而那个serial收集器又会造成各种停顿。所以这个收集器应运而生了。

CMS收集器

是一种以获取最短回收停顿时间为目标 的收集器。目前很大一部分的java应用集中在互联网和B/S架构的服务端上,这种应用非常重视 响应时间 ,而这个收集器就非常符合需求。它是采用的标记-清除算法。它是可以做到边打扫房间边扔垃圾的收集器。不过优点很大,那么缺点也不少,第一个就是效率意味着占用cpu资源 ,用这个收集器会使应用 程序变慢,第二就是无法 处理浮动垃圾,什么 是浮动垃圾,因为它采用的是标记 清除算法,就是先标记,再清除,那么 有一些垃圾产生 是在标记之后 ,那么只好等 下一次GC才能回收了。如果cms运行期间无法满足程序需要,那么就会临时启用serial old收集器来重新进行老年代的收集。第三个缺点 就是算法造成的,上一篇说过,这个算法会产生 大量的碎片 ,那么如果无法 为大对象 分配内存的时候会触发一次full gc,为了解决这个问题,cms收集器提供了一个参数,默认是开启的。是一个开头。就是不够使用的时候进行full gc是否开启内存碎片的合并整理 。如果开启了之后那么停顿时间 会变长。为了解决这一问题又出现了另一个参数,就是进行多少 次不压缩的full gc时来一次带压缩的,就是碎片整理间歇化。


G1收集器

这是当今收集器发展的最前沿成果之一,直到jdk1.7才认可它达到了成熟的程序 。

它的最大优点是结合了空间整合,不会产生 大量的碎片 ,也就降低了进行gc的频率。二是可以让使用者明确指定停顿时间。它有了这么高效率的原因之一就是会垃圾回收进行了划分优先级的操作,这种有优先级的区域回收方式保证了它的高效率。

几个垃圾收集器都讲完 了。说明 一下在这里讲的收集器都是大概 ,并不是非常 详细,不过知道了这些收集器的基本特征就可以判断出在什么 时候 使用哪个收集器了。如有需要再查资料也会得心应手。


0 0
原创粉丝点击