一、垃圾收集器总览

新生代:Serial、 ParNew、 Parallel Scavenge

老年代:CMS、Serial Old、 Parallel Old

最新的:G1

并行和并发的区别:

并行:指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态。

并发:指用户线程和垃圾收集线程同时执行(但不一定是并行的,可能会交替执行),用户线程在继续执行,而垃圾收集程序运行于另一个CPU上。

二、收集器

1. Serial收集器

  单线程收集器、“Stop The World”(必须停止其他工作线程)

  主要运行在Client模式下,简单而且高效。

  

2. ParNew收集器

  Serial的多线程版本,Server模式下的虚拟机首选的新生代收集器,除了Serial唯一可以与CMS收集器配合工作的收集器。

  

3.Parallel Scavenge收集器

  吞吐量优先的收集器、Parallel Scavenge收集器目标是达到一个可控制的吞吐量。(吞吐量=运行用户代码时间 / (运行用户代码时间 + 垃圾收集时间))。拥有GC自适应的调节策略。

4. Serial Old收集器

  Serial收集器的老年代版本,单线程,使用“标记 - 整理”算法。

  

5. Parallel Old收集器

Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法。吞吐量优先的收集器的组合(Parallel Scavenge 和 Parallel Old)。

  

6. CMS收集器

  以获取最短回收停顿时间为目标。基于“标记 — 清除”算法。

  具体实现主要为四个步骤:

  1. 初始标记 (Stop the world) 初始标记仅仅是标记GC Roots能直接关联到的对象;
  2. 并发标记                           并发标记进行GC Roots Tracing;
  3. 重新标记 (Stop the world) 重新标记修正并发标记期间,标记产生变动的记录;
  4. 并发清除

  CMS收集器的缺点:

  • 对CPU资源过于敏感
  • 无法处理“浮动垃圾”(并发清除阶段产生的垃圾)。因此需要在老年代空间中为浮动垃圾预留一部分空间,如果预留空间不足,则会出现一次“Concurrent Mode Failure”失败,临时启用Serial Old收集器进行垃圾回收。
  • 基于标记清除算法,会产生内存碎片。

    

7. G1收集器

  G1收集器的特点:

  1. 并行与并发
  2. 分代收集
  3. 空间整合:整体看“标记—整理”,局部看“复制”,不会产生内存碎片
  4. 可预测的停顿

  实现方法:

  • 将整个Java堆分成多个大小相等的独立区域,新生代和老年代分别是部分区域的集合。
  • 根据每个区域的垃圾堆积的价值多少,优先回收价值最大的区域。
  • 通过Remembered Set来避免全堆扫描。

  G1收集器的主要步骤:

  1. 初始标记
  2. 并发标记
  3. 最终标记
  4. 筛选回收

    

三、内存分配与回收策略

  Minor GC和Full GC的区别:

  • Minor GC : 新生代的垃圾回收动作
  • Full GC : 老年代的垃圾回收动作。 Full GC一般比Minor GC慢10倍以上。

  对象的内存分配与回收策略,就是在堆上分配:

  1. 对象优先在Eden区分配
  2. 大对象直接进入老年代
  3. 长期存活的对象将进入老年代(根据年龄判断,新生代Survivor空间相同年龄所有对象大小总和大于Survivor空间的一半,直接进入老年代)

  空间分配担保:

  1. 新生代进行垃圾回收,首先检查老年代的最大可用连续空间是否大于新生代所有对象总空间。大于则确保是安全的。
  2. 如果小于。首先查看是否允许担保失败。
  3. 如果允许,检查老年代最大可用连续空间是否大于历次晋升到老年代对象的平均大小,如果大于,则进行一次Minor GC。
  4. 如果小于或者不允许担保失败,则进行一次Full GC.  

最新文章

  1. php保留键随机打乱数组顺序
  2. Canvas事件处理
  3. iOS动画详解(一)
  4. python_在windows下安装配置python开发环境及Ulipad开发工具
  5. mysql5.7.16安装
  6. HDU2048 HDU2049 组合数系列 错排
  7. g++基本用法
  8. 【python标准库模块五】Xml模块学习
  9. 用Python学分析 - 散点图
  10. HBase RowKey与索引设计
  11. 【转载】Java性能优化之JVM GC(垃圾回收机制)
  12. C#中一些关联名词的含义归纳
  13. 深入理解java虚拟机---虚拟机工具jconsole(十八)
  14. VSFTPD虚拟用户配置
  15. Introduction of Build Tool/Maven, Gradle
  16. install kubernetes dashboard 安装 kubernetes dashboard 详细
  17. svn命令行使用
  18. # 20145106 《Java程序设计》第3周学习总结
  19. Python基础部分的疑惑解析(2)
  20. TaobaoVM

热门文章

  1. html5新特性data_*自定义属性使用
  2. 【转】将Centos的yum源更换为国内的阿里云源
  3. c语言数字图像处理(九):边缘检测
  4. CS224n学习笔记1——深度自然语言处理
  5. VirtualBox共享文件夹 Windows 7 (宿主机) + Ubuntu 12.04
  6. 工程能力之C4模型
  7. “Hello World!”团队第六周的第三次会议
  8. 第十次作业psp
  9. 05慕课网《进击Node.js基础(一)》HTTP概念进阶(同步/异步)
  10. spring冲刺第八天