一、垃圾收集器总览

新生代: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.  

深入理解JAVA虚拟机阅读笔记3——垃圾回收器的更多相关文章

  1. 深入理解JAVA虚拟机阅读笔记2——垃圾回收

    线程私有的程序计数器.虚拟机栈和本地方法栈随线程而生,随线程而灭.栈中的栈帧随方法的进入和退出有条不紊的入栈和出栈. 而Java堆和方法区因为需要多大内存.创建多少对象都是不确定的,因此这两个区域是垃 ...

  2. 深入理解JAVA虚拟机阅读笔记1——JAVA内存区域

    一.Java内存区域 1.程序计数器 线程私有. 当前线程所执行的字节码的行号指示器.由于JAVA是多线程的,因此每个线程都独立的程序计数器. 异常:没有规定任何OutOfMemeryError情况的 ...

  3. 深入理解Java 虚拟机阅读笔记(一)

    1.程序计数器- 占用空间:较小 作用:字节码行号指示器 作用详情:指示指令执行,如(字节码的执行,分支,循环,跳转,异常处理,线程恢复) 特点:线程私有(每个计数器独立计算,上下文相互独立). 2. ...

  4. 深入理解Java虚拟机--阅读笔记二

    垃圾收集器与内存分配策略 一.判断对象是否已死 1.垃圾收集器在对堆进行回收前,要先判断对象是否已死.而判断的算法有引用计数算法和可达性分析算法: 2.引用计数算法是给对象添加引用计数器,有地方引用就 ...

  5. 深入理解Java虚拟机--阅读笔记一

    Java内存区域 一.java运行时数据区域 1. 程序计数器:程序计数器占据的内存空间较小,是当前运行线程执行的字节码的计数:分支.循环.跳转.异常处理.线程恢复等都要依赖技术器来对执行的字节码进行 ...

  6. 深入理解JAVA虚拟机阅读笔记4——虚拟机类加载机制

    虚拟机把描述类的Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 在Java语言中,类型的加载.连接和初始化过程都是 ...

  7. 深入理解java虚拟机阅读笔记(1)运行时数据区域

    java虚拟机所管理的内存区域主要分为方法区.堆:虚拟机栈.本地方法栈.程序计数器,如图: 1.程序计数器是当前线程所执行的字节码行号指示器,用以记录当前指令执行的位置.程序计数器是线程私有的,每个线 ...

  8. 深入理解Java虚拟机--阅读笔记三

    垃圾收集器 手机算法是内存回收的方法论,垃圾收集器是内存回收的具体实现. 并行:指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态 并发:值用户线程与垃圾收集线程同时执行(但并不一定是并行的) ...

  9. 深入理解JAVA虚拟机阅读笔记6——线程安全与锁优化

    线程安全:如果一个对象可以安全的被多个线程同时使用,那它就是线程安全的. 一.Java中的线程安全 1.不可变 不可变的对象一定是线程安全的.String.枚举类型.java.lang.Number的 ...

随机推荐

  1. Java 图片处理解决方案:ImageMagick 快速入门教程

    文章首发于[博客园-陈树义],点击跳转到原文Java 图片处理解决方案:ImageMagick 快速入门教程. ImageMagick介绍 ImageMagick是一个免费的创建.编辑.合成图片的软件 ...

  2. [学习笔记]PCL使用心得

    最近开始做研究生毕设,有一部分因为没有什么好的思路,就把以前用过的PCL点云搬出来,重新用源码装了一遍PCL,一开始装的过程中没什么大问题,在后面用的时候碰到了很多小问题,特此记录. 1.PCL版本问 ...

  3. 啥是MD5?

    啥是MD5加密呢?为啥要使用MD5这种非对称的加密方式呢? 本文将通过漫画的形式来通俗易懂的讲述什么是MD5加密算法(Message Digest Algorithm MD5(中文名为消息摘要算法第五 ...

  4. 如何布局您的PC站和移动站,并表达两者之间内容的对应关系

      如何布局您的PC站和移动站,并表达两者之间内容的对应关系 目前较流量的PC站与移动站配置方式有三种,百度站在搜索引擎角度将这三种分别称为跳转适配.代码适配和自适应,以下为这三种配置方式的名词解释及 ...

  5. k8s环境搭建--基于kubeadm方法

    环境 master node: 数量 1, 系统 ubuntu 16.04_amd64 worker node: 数量 1, 系统 ubuntu 16.04_amd64 kubernetes 版本: ...

  6. 2015第六届蓝桥杯C/C++ B组

    奖券数目:枚举 有些人很迷信数字,比如带“4”的数字,认为和“死”谐音,就觉得不吉利.虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求.某抽奖活动的奖券号码是5位数(10000-99999),要求其 ...

  7. Babel 入门教程

    Babel是一个广泛使用的转码器,可以将ES6代码转为ES5代码,从而在现有环境执行. 这意味着,你可以现在就用 ES6 编写程序,而不用担心现有环境是否支持.下面是一个例子. // 转码前 inpu ...

  8. Win7-64位PowerDesigner下MySQLODBC驱动问题

    操作系统:win7-64位,PowerDesigner15.1(以下简称PD), MYSQL-ODBC-64驱动.安装完MYSQL-ODBC-64却找不到相关驱动,用PD反导数据库,却找不到Mysql ...

  9. 关于如何使用Microsoft Word发博客

    关于如何使用Microsoft Word发博客   PS:以Microsoft Word 2010为例作具体操作,实际上Microsoft Word 2007也可以完成该功能,略有差异,但是只能是20 ...

  10. 团队冲刺--Seven

    昨天: 司宇航:测试功能版块,优化功能版块. 马佳慧:优化界面 . 王金萱:合并程序. 季方:  合并程序. 今天: 司宇航:优化功能版块. 马佳慧:优化界面 . 王金萱:优化界面. 季方:  完善功 ...