-XX:+UseSerialGC 年轻代和老年代都用串行收集器
-XX:+UseParNewGC 年轻代使用ParNew,老年代使用 Serial Old
-XX:+UseParallelGC 年轻代使用Paraller Scavenge,老年代使用Serial Old
-XX:+UseParallelOldGC 新生代Paraller Scavenge,老年代使用Paraller Old
-XX:+UseConcMarkSweepGC,表示年轻代使用ParNew,老年代的用CMS + Serial Old
-XX:+UseG1GC 使用G1垃圾回收器
-XX:+UseZGC 使用ZGC垃圾回收器java
-XX:+UseSerialGC = Serial New (DefNew) + Serial Old
小型程序。默认状况下不会是这种选项,HotSpot会根据计算及配置和JDK版本自动选择收集器算法
-XX:+UseParNewGC = ParNew + SerialOld这个组合已经不多用(在某些版本中已经废弃)服务器
-XX:+UseConc(urrent)MarkSweepGC = ParNew + CMS + Serial Old架构
-XX:+UseParallelGC = Parallel Scavenge + Parallel Old (1.8默认) 【PS + SerialOld】并发
-XX:+UseParallelOldGC = Parallel Scavenge + Parallel Old测试
-XX:+UseG1GC = G1操作系统
默认GC的查看方法
1.java -XX:+PrintCommandLineFlags -version
2.经过GC的日志来分辨线程
Linux下1.8版本默认的垃圾回收器究竟是什么?日志
面对如此众多的垃圾回收器,咱们应该如何选择一款适合本身应用的收集器呢?这个问题的答案主要受如下三个因素影响:对象
譬如硬件规格,要涉及的系统架构是 x86-32/6四、SPARC 仍是ARM/Aarch64;处理器的数量多少,分配内存的大小;选择的操做系统是 Linux、Solaris 仍是 Windows等。
版本号是多少?是 ZingJDK/Zulu、OracleJDK、Open-JDK、OpenJ9 抑或是其余公司的发行版?该 JDK 对应了《Java 虚拟机规范》的哪一个版本?
通常来讲,收集器的选择就从以上这几点出发来考虑。
举个例子,假设某个直接面向用户提供服务的 B/S 系统准备选择垃圾收集器,通常来讲延迟时间是这类应用的主要关注点,那么:
若是你有充足的预算但没有太多调优经验,那么一套带商业技术支持的专有硬件或者软件解决方案是不错的选择,Azul 公司之前主推的 Vega 系统和如今主推的 Zing VM 是这方面的表明,这样你就可使用传说中的 C4 收集器了。
若是你虽然没有足够预算去使用商业解决方案,但可以掌控软硬件型号,使用较新的版本,同时又特别注重延迟,那 ZGC 很值得尝试。
若是你对还处于实验状态的收集器的稳定性有所顾虑,或者应用必须运行在 Win-dows 操做系统下,那 ZGC 就无缘了,试试 Shenandoah 吧
若是你接手的是遗留系统,软硬件基础设施和 JDK 版本都比较落后,那就根据内存规模衡量一下,对于大概 10G 如下的堆内存,CMS 通常能处理得比较好,而对于更大的堆内存,可重点考察一下 G1。(这个通常现阶段使用较多)
固然,以上都是仅从理论出发的分析,实战中切不可纸上谈兵,根据系统实际状况去测试才是选择收集器的最终依据。