入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

Java虚拟机垃圾收集器

创建时间:2017-11-23 投稿人: 谢营 浏览次数:292

Java虚拟机垃圾收集器

Java虚拟机垃圾收集器

对象的存活时间有长有短,所以对于存活时间长的对象,减少被gc的次数可以避免不必要的开销。这样我们就把内存分成新生代和老年代,新生代存放刚创建的和存活时间比较短的对象,老年代存放存活时间比较长的对象。这样每次仅仅清理年轻代,老年代仅在必要时时再做清理可以极大的提高GC效率,节省GC时间。

第一阶段,串行收集器

Serial收集器

Serial收集器是一个单线程收集器,并且在JVM收集的过程中,必须暂停其它正在工作的线程,直到它收集结束。历史悠久,在JDK 1.3.1之前是新生代收集的唯一选择。目前仅是JVM运行在client模式下的默认新生代收集器。(因为client端资源有限,而它在处理时停顿时间可以控制在几十毫秒以内)

Serial Old收集器

Serial Old收集器是Serial收集器的老年代版本,也是一个单线程收集器,使用标记整理算法实现。目前仅是JVM运行在client模式下收集老年代使用。

第二阶段,并行收集器

ParNew收集器

ParNew收集器是Serial收集器的多线程版本。

Parallel Scavenge收集器

Parallel Scavenge收集器和ParNew收集器类似,也是新生代收集器,使用复制算法实现。

Parallel Old收集器

Parallel Old收集器也是老年代收集器,使用标记整理算法实现。

第三阶段,CMS收集器(Concurrent Mark Sweep)

CMS收集器是一种以获取最短回收停顿时间为目的的收集器,使用标记清理算法实现,是一个针对老年代进行回收的GC。

CMS处理4个阶段:

  • 初始标记:这个阶段需要暂停所有正在执行的线程,官方叫法是STW(Stop The World)。标记和GC Roots直接关联的对象,执行很快。

  • 并发标记:这个阶段进行GC Root Tracing,多线程执行,继续标记可达到的对象。

  • 并发预处理:这个阶段标记从新生代晋升的对象,新分配到老年代的对象以及并发阶段被修改的对象。

  • 重新标记:暂停所有用户线程,重新扫描堆中的对象,进行可达性分析,标记活着的对象。

  • 并发清除:用户线程被重新激活,同时清理那些无效的对象。

  • 重置:CMS清除内部状态,为下次回收做准备。

第四阶段,G1收集器(Garbage-First)

G1收集器(或者垃圾优先收集器)的设计初衷是为了尽量缩短处理超大堆(大于4GB)时产生的停顿。相对于CMS的优势而言是内存碎片的产生率大大降低。在G1中,堆被划分成许多个连续的区域(region)。每个区域大小为2的倍数,大小相等,在1M~32M之间。当一个对象空间大于一个区域的50%

G1处理4个阶段:

  • 初始标记:这个阶段是SWT的,并且会触发一次普通的Mintor GC。

  • 并发标记:这个阶段在整个堆中进行并发标记,若发现区域对象中的所有对象都可被回收,那这个区域会立即被回收。如果有不可被回收的对象,会计算该对象所在区域的对象活性(对象存活比率)。

  • 重新标记:这个阶段是SWT的,标记上一阶段产生的垃圾。

  • 并发清理:用户线程被重新激活,同时清理那些无效的对象。

G1优点:

  • 并发:G1能充分利用CPU、多核环境下的硬件优势,使用多个CPU(CPU或者CPU核心)来缩短stop-The-World停顿时间。部分其他收集器原本需要停顿线程执行的GC动作,G1收集器仍然可以通过并发的方式让程序继续执行。

  • 分代收集:虽然G1可以不需要其他收集器配合就能独立管理整个GC堆,但是还是保留了分代的概念。它能够采用不同的方式去处理新创建的对象和已经存活了一段时间,熬过多次GC的旧对象以获取更好的收集效果。

  • 空间整合:与CMS的“标记清理”算法不同,G1从整体来看是基于“标记整理”算法实现的收集器;从局部上来看是基于“复制”算法实现的。

  • 可预测的停顿:这是G1相对于CMS的另一个大优势,降低停顿时间是G1和CMS共同的关注点,但G1除了追求低停顿外,还能建立可预测的停顿时间模型,能让使用者明确指定在一个长度为M毫秒的时间片段内。

声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
  • 上一篇:没有了
  • 下一篇:没有了