垃圾收集器
垃圾收集算法是内存回收的方法论,垃圾收集器就是内存回收的具体实现。
HotSpot垃圾收集器存在连线说明可以搭配使用。只有对具体应用最合适的收集器,没有万能收集器。
1.Serial收集器:单线程,就是说垃圾手集时,必须暂停其他所有的工作线程,直到它收集结束。
Serial、SerialOld收集器Serial收集器适合虚拟机运行在Client模式下的默认新生代收集器。简单而高效,对于限定单个CPU的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程收集效率。
2.ParNew收集器 Serial收集器的多线程版本,除了使用多线程进行垃圾收集之外,其余行为包括Serial收集器可用的所有控制参数、收集算法、Stop the world,对象分配规则、回收策略等都与Serial收集器完全一样。
Parnew收集器是许多运行在Server模式下的虚拟机中的首选的新生代收集器,其中有一个与性能无关单很重要的原因是,只有Serial与Parnew能与CMS收集器配合工作。但是作为老年代收集器。ParNew收集器是CMS收集器的默认新生代收集器。
3,Parallel Scavenge:新生代收集器,使用复制算法,又是并行的多线程收集器。CMS等收集器的关注点是尽可能缩短垃圾收集时用户线程的停顿时间,而ParallelScavenge收集器的目的是达到一个可控制的吞吐量。吞吐量是CPU运行用户代码的时间与CPU总耗时指比值。停顿时间越短就越适合与用户交互的程序,良好的响应速度可以提升用户体验,而高吞吐量则可以最高效率地利用CPU时间,尽快地完成程序的运算任务,主要适合在后台运算而不需要太多交互的任务。
利用两个参数精确控制吞吐量,分别是最大垃圾收集停顿时间:-XX:MaxGCPauseMIllis以及直接设置吞吐量大小-XX:GCTimeRatio。
Parallel Scabenge收集器 GCTImeRatio吞吐量优先收集器
自适应调节策略4 Serial Old收集器:单线程收集器,使用标记-整理算法。
5,Parallel Old收集器:
CMS收集器:目标是获取最短回收停顿时间,对于互联网站或B/S系统的服务端上,这类应用尤其重视服务的响应速度,希望系统停顿时间最短,给用户较好的体验。使用标记清除算法实现的,
初始标记 并发标记 重新标记 并发清除
CMS主要优点:并发收集,低停顿
缺点:
1,对CPU资源非常敏感。面向并发设计的程序都对CPU资源比较敏感。在并发阶段,它虽然不会导致用户线程停顿,但是会因为占用了一部分线程而导致程序变慢,总吞吐量降低。
2,无法处理浮动垃圾。
3,由于使用的标记-清除算法,会产生内存碎片。
G1收集器:基于标记整理算法,不产生内存碎片,对于长时间运行的系统来说非常重要。而是它可以非常精确地控制停顿。G1将Java堆多个大小固定的独立区域,并且跟踪这些区域里面的垃圾堆积程度,在后台维护一个优先队列,每次根据允许的手收集时间,优先回收垃圾最多的区域。所以保证了在不牺牲吞吐量的同时完成低停顿的内存回收。