并行与并发
并行:并行描述的是多条垃圾收集器线程之间的关系,说明同一时间有多条这样的线程在协同工作,通常默认此时用户线程是处于等待状态。
并发:并发描述的是垃圾收集器与用户线程之间的关系,说明同一时间垃圾收集器线程与用户线程都在运行。由于用户线程未被冻结,所以程序仍能响应服务请求,但由于垃圾收集器占用了部分系统资源,此时应用系统处理的吞吐量会受到影响。
所以在对服务吞吐量进行优化时,也需要重点考虑垃圾收集器的选择。
Serial收集器
Serial是一个单线程的收集器。这里所谓的单线程并不是只会使用一个处理器或一个收集线程去完成垃圾收集工作。更重要的是在它进行垃圾收集时,必须暂停其他工作线程。
对于单核处理器或处理器核心数较少的环境中,Serial收集器由于没有线程交互的开销,专心做垃圾收集,在单线程中Serial收集效率较高。优点:简单高效。
应用场景:在用户桌面的应用场景以及部分微服务应用中,分配给虚拟机管理的内存一般来说并不会特别大,收集几十兆甚至几百兆的新生代(仅指新生代中使用的内存),垃圾收集时间甚至可以控制在十几、几十毫秒。只要不频繁的发生垃圾收集,短暂的停顿对于用户是可以接受的。
ParNew收集器
ParNew收集器实质上是Serial收集器的多线程并行版本,除了使用多线程进行垃圾收集之外,其余的行为包括Serial收集器可用的所有控制参数(例如:-XX:SurvivorRatio、-XX:PretenureSizeThreshold、-XX:HandlePromotionFailure等)、收集算法、Stop The World、对象分配规则、回收策略等与Serial收集器完全一致。
ParNew收集器除了支持多线程并行收集之外,其他与Serial收集器相比并没有太多创新之处,但它却是不少运行在服务端模式下的HotSpot虚拟机,尤其是JDK 7之前的遗留系统中首选的新生代收集器,其中有一个与功能、性能无关但其实很重要的原因是:除了Serial收集器外,目前只有它能与CMS收集器配合工作。
Parallel Scavenge收集器
Parallel Scavenge是一款新生代垃圾收集器,基于标记复制算法实现的收集器,并且能够并行收集的多线程收集器。
Parallel Scavenge收集器的特点与其他收集器不同,Parallel Scavenge目标是达到一个可控制的吞吐量。该吞吐量指处理器用于运行用户代码的时间与处理器总