垃圾收集器

1. 新生代收集器

Serial

1. 单线程工作。
2. 工作时会暂停其他工作线程,直到它收集结束。
3. 触发严重的“stop the world”
4. 在垃圾收集时,采用复制算法进行垃圾收集

ParNew

1. 多线程工作。
2. 其他特性和Serial收集器一样。
3. 唯一一个可以与CMS收集器配合工作。(配置-XX:+UseConcMarkSweepGC使用CMS进行老年代垃圾收集,默认对应的新生代垃圾收集器就是ParNew)
4. ParNew是并行收集,CMS是并发收集。
    并行:多条垃圾收集线程工作的时候,用户线程处于等待状态。
    并发:用户线程和垃圾收集线程同时执行。

ParallelScavenge(可控的吞吐量)

ParallelScavenge的关注点是达到一个可控制的吞吐量。适用于后台运算。
CMS的关注点是尽量缩短垃圾收集时用户线程的停顿时间。适用于用户交互程序。

吞吐量:用户线程执行时间/(用户线程执行时间 + 垃圾收集时间)

2. 老年代收集器

CMS

步骤:
1. 初始标记
2. 并发标记
3. 重新标记
4. 并发清除

其中,
并发标记和并发清除,是允许用户线程和垃圾收集线程并发执行。不发生STW
初始标记和重新标记,需要暂停用户线程,会发生STW

缺点:
1. 使用CMS,由于是垃圾回收线程和用户线程并发执行,会导致应用程序变慢,吞吐量下降。
2. 产生一定的浮动垃圾。并发清理阶段,用户线程的运行会产生新的垃圾,这一部分垃圾是在标记阶段之后,
   因此在当此收集过程中无法回收,只能放到下次垃圾收集。这一部分垃圾称为浮动垃圾。
3. 会产生大量的内存碎片

SerialOld(MSC)

ParallelOld

3. G1收集器

1. 支持并行(多cpu)和并发(收集线程和用户线程并发执行)
2. 分代收集(逻辑上的分代,物理上不连续的内存也可以是同一代)
3. 采用内存分区(Region)的思路,将内存划分为一个个相等大小的内存分区,回收时则以分区为单位进行回收,
存活的对象复制到另一个空闲分区中。由于都是以相等大小的分区为单位进行操作,因此G1天然就是一种压缩方案(局部压缩);
4. 支持混合收集,新生代和老年代可以同时进行垃圾收集 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Java和C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进来,墙里面的人想出来。 对象...
    胡二囧阅读 4,813评论 0 4
  • 如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。 Java虚拟机规范中对垃圾收集器应该如何...
    梦工厂阅读 17,897评论 11 64
  • 概念理解新生代收集器Serial收集器ParNew收集器Parallel Scavenge收集器老年代收集器Ser...
    懒癌正患者阅读 1,729评论 0 0
  • 把《纽约琐记(修订版)》翻完后,终于确认了陈丹青在这书再版序言里的话——他出过这么三五本书,也就这么一本尚可读。大...
    灰土豆阅读 8,428评论 4 17
  • 超越,为什么世界上有这个词呢?因为这个世界上有很多人被超越过,为什么会有超越,是因为前面的动力不转了,所以后面...
    崔禹喆阅读 962评论 1 0