既然选择了远方,即便天寒地冻,路遥马亡,我本就一无全部,又有何惧。算法
[GC (Allocation Failure) [DefNew: 67932K->0K(78720K), 0.0002327 secs] 68792K->859K(253504K), 0.0002491 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 复制代码
[Full GC (Allocation Failure) [Tenured: 10250K->10249K(15360K), 0.0187416 secs] 10250K->10249K(19968K), [Metaspace: 9228K->9228K(1058816K)], 0.0187608 secs] [Times: user=0.01 sys=0.00, real=0.01 secs]复制代码
[GC (Allocation Failure) [ParNew: 82K->24K(4608K), 0.0003178 secs][Tenured: 15353K->10251K(15360K), 0.0185459 secs] 15435K->10251K(19968K), [Metaspace: 8855K->8855K(1056768K)], 0.0188925 secs] [Times: user=0.02 sys=0.00, real=0.02 secs] 复制代码
[GC (Allocation Failure) [PSYoungGen: 2410K->512K(4608K)] 12650K->10947K(19968K), 0.0016662 secs] [Times: user=0.01 sys=0.00, real=0.01 secs] 复制代码
[Full GC (Allocation Failure) [PSYoungGen: 480K->0K(4608K)] [ParOldGen: 10499K->626K(15360K)] 10979K->626K(19968K), [Metaspace: 3063K->3063K(1056768K)], 0.0043604 secs] [Times: user=0.02 sys=0.00, real=0.00 secs] 复制代码
CMS 是一款 低停顿 的 老年代 垃圾收集器。通常与 Serial, ParNew 新生代收集器一块儿工做,默认是 ParNew。 工做流程细化为如下几个步骤多线程
与应用线程并发执行,处理上一个阶段被标记为 dirty 的对象。该阶段为了减小 从新标记 产生的停顿时间,有可能会等待一次 ygc并发
在并发清理阶段,提到,有可能会发生 concurrent mode failure 现象。 出现该现象的本质缘由以下: 老年代没有足够的空间分配对象,从而致使使用 Serial Old 垃圾收集器触发一次 Full GCide
CMS 默认启动的并发线程是(ParallelGCThreads + 3)/ 4. ParallelGCThreads 表示新生代 GC 线程数量。-XX:ConcGCThreads -XX:ParallelCMSThreads 可手动指定 CMS 并发线程 2. -XX:+CMSScavengeBeforeRemark 在进行 从新标记 阶段时,会执行一次 ygc3. -XX:CMSInitiatingOccupancyFraction 默认68,当老年代空间使用率达到该值时,会执行一次 CMS GC4. -XX:+UseCMSCompactAtFullCollection 使 CMS 在垃圾收集完成后,进行一次内存碎片整理,碎片整理会 stop the world。 5. -XX:CMSFullGCsBeforeCompaction 默认0,设定进行多少次 CMS 回收后,进行一次内存压缩 6. -XX:CMSMaxAbortablePrecleanTime 默认 5000 毫秒,预清理阶段,等待 ygc 最大时间 7. -XX:+CMSClassUnloadingEnabled 容许回收 Class性能
笔者没法在 jdk1.8 上,测试出 serial + parallel old 组合。测试
CMS垃圾收集器spa