若是说收集算法是内存回收的方法论,垃圾收集器就是内存回收的具体实现
复制代码
吞吐量:表示系统减去系统回收时间占总时间的比率,好比,系统运行了100秒,垃圾回收占用了1秒,那么吞吐量就是(100-1)/100 = 99%算法
垃圾回收消耗:和吞吐量相反,垃圾回收器消耗指的是垃圾回收器耗时与系统运行总时间的比值编程
停顿时间:指垃圾回收器运行的时候,系统停顿的时间服务器
回收频率:指垃圾回收器多长时间运行一次,通常来讲,对于固定的应用而言,垃圾回收器的频率应该越低越好,一般增长堆空间能够有效的下降垃圾回收发生的频率,可是可能会增长回收产生的停顿时间多线程
反应时间:当一个内存对象被标记为垃圾对象后到这个对象真正回收所产生的时间并发
根据这几个指标,咱们能够知道,垃圾回收性能好的表现是:吞吐量高,垃圾回收消耗低,停顿时间少,回收频率低,反应时间快。可是,并无这么完美的性能表现,这几个指标有些是互斥的,好比要下降回收频率,就要扩大空间,可是就会增长停顿时间;一样要想反应时间快,就必需要提升回收频率。因此,这些性能的追求就是一个博弈平衡的过程,咱们能够根据咱们追求的某一方面来进行调优,好比,对于客户端应用而言,应该尽量下降其停顿时间,给用户良好的使用体验,为此,能够牺牲垃圾回收的吞吐量;对服务端程序来讲,可能会更加关注吞吐量。jvm
串行收集器是最古老、最稳定以及效率高的垃圾回收器。布局
使用单线程进行垃圾回收,独占式垃圾回收性能
串行垃圾回收器经过持有应用程序全部的线程进行工做。它为单线程环境设计,只使用一个单独的线程进行垃圾回收,经过冻结全部应用程序线程进行工做,因此可能不适合服务器环境spa
它最适合的是简单的命令行程序(单CPU、新生代空间较小及对暂停时间要求不是很是高的应用)。是client级别默认的GC方式。命令行
新生代、老年代使用串行回收;新生代复制算法、老年代标记-压缩;垃圾收集的过程当中会Stop The World(服务暂停)
参数控制: -XX:+UseSerialGC 串行收集器
ParNew收集器其实就是Serial收集器的多线程版本。新生代并行,老年代串行;新生代复制算法、老年代标记-压缩
只有他能与CMS收集器配合工做。
参数控制:
-XX:+UseParNewGC ParNew收集器 -XX:ParallelGCThreads 限制线程数量 -XX:+UseParNewGC:新生代使用并行收集器,老年代使用串行回收器。 -XX:+UseConcMarkSweepGC:新生代使用并行回收器,老年代使用CMS
并行收集器工做时的线程数量可使用 -XX:ParallelGCThreads 参数指定。通常最好与CPU数量至关,避免过多的线程数,影响垃圾收集性能
在默认状况下,当CPU数量小于8个时,ParallelGCThreads 的值等于 CPU 数量;当 CPU 数量大于8个时,ParallelGCThreads 的值等于 3+[(5*CPU_Count)/8]
并行垃圾回收器也被称之为:吞吐量收集器(throughput collector)
他是jvm默认的垃圾回收器
与串行垃圾回收器不一样的是它使用多线程进行垃圾回收,使用的是复制算法
类似的是执行垃圾回收的时候,他也会冻结全部的应用程序线程
使用与CPU、对暂停时间要求较短的应用上,是server级别默认采用的GC方式。
参数控制
-XX:+UseParallelGC 新生代使用并行回收收集器,老年代使用串行回收器。 -XX:ParallelGCThreads=4 指定线程数
Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法。这个收集器是在JDK 1.6中才开始提供
参数控制
-XX:+UseParallelOldGC 使用Parallel收集器+ 老年代并行
相比并行垃圾回收器,并发标记扫描垃圾回收器使用更多的CPU来确保程序的吞吐量。若是咱们能够为了更好的程序性能分配更多的CPU,那么并发标记上扫描垃圾回收器是更好的选择相比并发垃圾回收器。
经过JVM参数 XX:+USeParNewGC 打开并发标记扫描垃圾回收器。
并发收集、低停顿
产生大量空间碎片、并发阶段会下降吞吐量
组合 | 新生代GC策略 | 老年老代GC策略 | 说明 |
---|---|---|---|
组合1 | Serial | Serial Old | Serial和Serial Old都是单线程进行GC,特色就是GC时暂停全部应用线程。 |
组合2 | Serial | CMS+Serial Old | CMS(Concurrent Mark Sweep)是并发GC,实现GC线程和应用线程并发工做,不须要暂停全部应用线程。另外,当CMS进行GC失败时,会自动使用Serial Old策略进行GC |
组合3 | ParNew | CMS | 使用 -XX:+UseParNewGC选项来开启。ParNew是Serial的并行版本,能够指定GC线程数,默认GC线程数为CPU的数量。可使用-XX:ParallelGCThreads选项指定GC的线程数。若是指定了选项 -XX:+UseConcMarkSweepGC选项,则新生代默认使用ParNew GC策略。 |
组合4 | ParNew | Serial Old | 使用 -XX:+UseParNewGC选项来开启。新生代使用ParNew GC策略,年老代默认使用Serial Old GC策略。 |
组合5 | Parallel Scavenge | Serial Old | Parallel Scavenge策略主要是关注一个可控的吞吐量:应用程序运行时间 / (应用程序运行时间 + GC时间),可见这会使得CPU的利用率尽量的高,适用于后台持久运行的应用程序,而不适用于交互较多的应用程序。 |
组合6 | Parallel Scavenge | Parallel Old | Parallel Old是Serial Old的并行版本 |
组合7 | G1GC | G1GC | -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC #开启; -XX:MaxGCPauseMillis=50 #暂停时间目标; -XX:GCPauseIntervalMillis=200 #暂停间隔目标; -XX:+G1YoungGenSize=512m #年轻代大小; -XX:SurvivorRatio=6 #幸存区比例 |