垃圾收集器就是内存回收操做的具体实现,HotSpot 有 7 种。由于它们各有各的适用场景。有的属于新生代收集器,有的属于老年代收集器,因此通常都是搭配使用的。关于它们的简单介绍以及分类请见下图。算法
特色:数组
1.“单线程”操做。会产生“Stop The World”。
2.采用"Stopr the world"。
3.Serial 收集器是虚拟机在 Client模式下的默认新生代收集器,它的优点是简单高效,适合单 CPU 模式。
复制代码
1.其自己就是 Serial 收集器的多线程版本。虽然除此以外没什么创新之处,但它倒是许多运行在 Server 模式下的虚拟机中的首选新生代收集器。
2.除了 Serial 收集器外,只有它能和 CMS 收集器搭配使用。
复制代码
1.新生代收集器,并行的多线程收集器。
2.使用复制算法,
3.可控制吞吐量(Throughput)。
复制代码
吞吐量 = 运行用户代码时间 / ( 运行用户代码时间 + 垃圾收集时间 )安全
可调节的虚拟机参数:多线程
-XX:MaxGCPauseMillis
:最大 GC 停顿的秒数;-XX:GCTimeRatio
:吞吐量大小,一个 0 ~ 100 的数,最大 GC 时间占总时间的比率 = 1 / (GCTimeRatio + 1)
;-XX:+UseAdaptiveSizePolicy
:一个开关参数,打开后就无需手工指定 -Xmn
,-XX:SurvivorRatio
等参数了,虚拟机会根据当前系统的运行状况收集性能监控信息,自行调整。1.Serial收集器的老年代版,同为单线程。
2.使用标记整理算法。
3.做为CMS收集容器的后备预案。
复制代码
1.Parallel Old收集器的老年代版,多线程。
2.使用标记-整理算法。
复制代码
特色:并发
1.CMS注重于服务的响应速度,但愿系统停顿时间最短。
2.基于“标记-清除”算法实现的。【注1】
3.存在如下几点缺点:
(1)CMS收集器对CPU资源很是敏感。
(2)CMS收集器没法处理浮动垃圾。
(3)因为基于标记-清除算法,因此会产生大量碎片
复制代码
【注1】 标记-清除算法步骤: 1.初始标记 2.并发标记 3.从新标记 4.并发清除性能
参数设置:spa
-XX:+UseCMSCompactAtFullCollection
:在 CMS 要进行 Full GC 时进行内存碎片整理(默认开启)-XX:CMSFullGCsBeforeCompaction
:在多少次 Full GC 后进行一次空间整理(默认是 0,即每一次 Full GC 后都进行一次空间整理)关于 CMS 使用 标记 - 清除 算法的一点思考:线程
以前对于 CMS 为何要采用 标记 - 清除 算法十分的不理解,既然已经有了看起来更高级的 标记 - 整理 算法,那 CMS 为何不用呢?最近想了想,感受多是这个缘由,不过也不是很肯定,只是我的的一种猜想。指针
标记 - 整理 会将全部存活对象向一端移动,而后直接清理掉边界之外的内存。这就意味着须要一个指针来维护这个分隔存活对象和无用空间的点,而咱们知道 CMS 是并发清理的,虽然咱们启动了多个线程进行垃圾回收,不过若是使用 标记 - 整理 算法,为了保证线程安全,在整理时要对那个分隔指针加锁,保证同一时刻只有一个线程能修改它,加锁的这一过程至关于将并行的清理过程变成了串行的,也就失去了并行清理的意义了。日志
因此,CMS 采用了 标记 - 清除 算法。
特色: 1.并行并发。 2.分代收集。 3.空间整合。 4.可预测的停顿。
1.初始标记
2.并发标记
3.最终标记
4.筛选回收
复制代码
新生代和老年代的 GC 操做:
- 新生代 GC 操做:Minor GC
- 发生的很是频繁,速度较块。
- 老年代 GC 操做:Full GC / Major GC
- 常常伴随着至少一次的 Minor GC;
- 速度通常比 Minor GC 慢上 10 倍以上。
-Xmx
:Java 堆的最大值;-Xms
:Java 堆的最小值;-Xmn
:新生代大小;-XX:SurvivorRatio=8
:Eden 区 / Survivor 区 = 8 : 1-XX:PretenureSizeThreshold
:单位是字节;
-XX:MaxTenuringThreshold
设定值后,会被晋升到老年代,-XX:MaxTenuringThreshold
默认为 15;