今天我给大家分享的是Serial收集器,垃圾收集器就是内存回收的具体实现。Java虚拟机规范中对垃圾收集器应该如何实现并没有任何规定,因此不同的厂商,不同的版本的虚拟机所提供的垃圾收集器都可能会有很大的差别,并且一般都会提供参数供用户根据自己的应用特点和要求组合出各个年代所使用的收集器,这里讨论的收集器基于Sun HotSpot虚拟机1.6版Update22,这个虚拟机包含的所有的收集器如图所示。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ?上图展示了7种作用于不同分代的收集器,如果两个收集器之间存在连线,就说明它们可以搭配使用。在介绍这些收集器各自的特性之前,我们先来明确一个观点:虽然我们是在对各个收集器进行比较,但并非为来挑选一个最好的收集器出来。因为直到现在为止还没有最好的收集器出现,更加没有万能的收集器,所以我们喧杂的只是对具体应用最合适的收集器。
? ? ? 现在我们来说说Serial收集器把,它是最基础并且最早的收集器,曾经是虚拟机新生代收集的唯一选择。它是一个单线程的收集器,但它的”单线程“的意思并不仅仅是说明它只会使用一个CPU或一条收集线程去完成垃圾收集工作,更重要的是它在进行垃圾收集时,必须暂停其他所有的工作线程,直到收集结束。这项工作实际上是由虚拟机在后台自动发起和自动完成的,在用户不可见的情况下把用户的正常工作的线程全部停掉,这对很多应用来说都是难以接受的。
? ? ?对于这种恶劣的体验,虚拟机的设计者表示完全理解,但也表示非常委屈:“你妈妈在给你打扫房间的时候,肯定也会让你老老实实地在椅子上或房间外待着,如果她一边打扫,你一边乱扔纸屑,这房间还能打扫完吗?”这确实是一个合情合理的矛盾,虽然垃圾收集这项工作听起来和打扫房间属于一个性质,但实际上可能肯定还要比打扫房间复杂得多啊。??
? ? ? ?? ? ? ? ? ?
? ? ? ? ?其实它虽然存在自己的不足,但它依然是虚拟机运行在Client模式下但默认新生代收集器。它有着优于其他收集器的地方:简单而高效,对于限定单个CPU的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程收集效率。在用户的桌面应用场景中,分配给虚拟机管理的内存一般来说不会很大,停顿时间完全可以控制在几十毫秒最多一百多毫秒以内,只要不是频繁发生,这点停顿还是可以接受的。所以,Serial收集器对于运行在Client模式下的虚拟机来说是一个很好的选择。? ? ? ?
原文地址:http://blog.51cto.com/13971805/2341885