深入理解JAVA虚拟机阅读笔记3——垃圾回收器
一、垃圾收集器总览
新生代: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收集器
以获取最短回收停顿时间为目标。基于“标记 — 清除”算法。
具体实现主要为四个步骤:
- 初始标记 (Stop the world) 初始标记仅仅是标记GC Roots能直接关联到的对象;
- 并发标记 并发标记进行GC Roots Tracing;
- 重新标记 (Stop the world) 重新标记修正并发标记期间,标记产生变动的记录;
- 并发清除
CMS收集器的缺点:
- 对CPU资源过于敏感
- 无法处理“浮动垃圾”(并发清除阶段产生的垃圾)。因此需要在老年代空间中为浮动垃圾预留一部分空间,如果预留空间不足,则会出现一次“Concurrent Mode Failure”失败,临时启用Serial Old收集器进行垃圾回收。
- 基于标记清除算法,会产生内存碎片。

7. G1收集器
G1收集器的特点:
- 并行与并发
- 分代收集
- 空间整合:整体看“标记—整理”,局部看“复制”,不会产生内存碎片
- 可预测的停顿
实现方法:
- 将整个Java堆分成多个大小相等的独立区域,新生代和老年代分别是部分区域的集合。
- 根据每个区域的垃圾堆积的价值多少,优先回收价值最大的区域。
- 通过Remembered Set来避免全堆扫描。
G1收集器的主要步骤:
- 初始标记
- 并发标记
- 最终标记
- 筛选回收

三、内存分配与回收策略
Minor GC和Full GC的区别:
- Minor GC : 新生代的垃圾回收动作
- Full GC : 老年代的垃圾回收动作。 Full GC一般比Minor GC慢10倍以上。
对象的内存分配与回收策略,就是在堆上分配:
- 对象优先在Eden区分配
- 大对象直接进入老年代
- 长期存活的对象将进入老年代(根据年龄判断,新生代Survivor空间相同年龄所有对象大小总和大于Survivor空间的一半,直接进入老年代)
空间分配担保:
- 新生代进行垃圾回收,首先检查老年代的最大可用连续空间是否大于新生代所有对象总空间。大于则确保是安全的。
- 如果小于。首先查看是否允许担保失败。
- 如果允许,检查老年代最大可用连续空间是否大于历次晋升到老年代对象的平均大小,如果大于,则进行一次Minor GC。
- 如果小于或者不允许担保失败,则进行一次Full GC.
深入理解JAVA虚拟机阅读笔记3——垃圾回收器的更多相关文章
- 深入理解JAVA虚拟机阅读笔记2——垃圾回收
线程私有的程序计数器.虚拟机栈和本地方法栈随线程而生,随线程而灭.栈中的栈帧随方法的进入和退出有条不紊的入栈和出栈. 而Java堆和方法区因为需要多大内存.创建多少对象都是不确定的,因此这两个区域是垃 ...
- 深入理解JAVA虚拟机阅读笔记1——JAVA内存区域
一.Java内存区域 1.程序计数器 线程私有. 当前线程所执行的字节码的行号指示器.由于JAVA是多线程的,因此每个线程都独立的程序计数器. 异常:没有规定任何OutOfMemeryError情况的 ...
- 深入理解Java 虚拟机阅读笔记(一)
1.程序计数器- 占用空间:较小 作用:字节码行号指示器 作用详情:指示指令执行,如(字节码的执行,分支,循环,跳转,异常处理,线程恢复) 特点:线程私有(每个计数器独立计算,上下文相互独立). 2. ...
- 深入理解Java虚拟机--阅读笔记二
垃圾收集器与内存分配策略 一.判断对象是否已死 1.垃圾收集器在对堆进行回收前,要先判断对象是否已死.而判断的算法有引用计数算法和可达性分析算法: 2.引用计数算法是给对象添加引用计数器,有地方引用就 ...
- 深入理解Java虚拟机--阅读笔记一
Java内存区域 一.java运行时数据区域 1. 程序计数器:程序计数器占据的内存空间较小,是当前运行线程执行的字节码的计数:分支.循环.跳转.异常处理.线程恢复等都要依赖技术器来对执行的字节码进行 ...
- 深入理解JAVA虚拟机阅读笔记4——虚拟机类加载机制
虚拟机把描述类的Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 在Java语言中,类型的加载.连接和初始化过程都是 ...
- 深入理解java虚拟机阅读笔记(1)运行时数据区域
java虚拟机所管理的内存区域主要分为方法区.堆:虚拟机栈.本地方法栈.程序计数器,如图: 1.程序计数器是当前线程所执行的字节码行号指示器,用以记录当前指令执行的位置.程序计数器是线程私有的,每个线 ...
- 深入理解Java虚拟机--阅读笔记三
垃圾收集器 手机算法是内存回收的方法论,垃圾收集器是内存回收的具体实现. 并行:指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态 并发:值用户线程与垃圾收集线程同时执行(但并不一定是并行的) ...
- 深入理解JAVA虚拟机阅读笔记6——线程安全与锁优化
线程安全:如果一个对象可以安全的被多个线程同时使用,那它就是线程安全的. 一.Java中的线程安全 1.不可变 不可变的对象一定是线程安全的.String.枚举类型.java.lang.Number的 ...
随机推荐
- [洛谷P2057][bzoj1934]善意的投票(最大流)
题目描述 幼儿园里有n个小朋友打算通过投票来决定睡不睡午觉.对他们来说,这个问题并不是很重要,于是他们决定发扬谦让精神.虽然每个人都有自己的主见,但是为了照顾一下自己朋友的想法,他们也可以投和自己本来 ...
- 树莓派3b添加python时间同步脚本
树莓派没有电池,因此断电后系统时间会停止,直到你开机后又继续计时,所以会造成系统时间和实际时间有很大的误差. 因为项目需要用到本地时间,精度要求不高不想折腾(如果需要高精度,需要安装ntp),所以考虑 ...
- [Unity3D]MonoDeveloper快捷键(补全代码补全引用中文乱码tab转空格)
Hello亲爱的观众朋友们大家好,我是09. vs支持各种插件,一般推荐用vs.不过总有人(例如我)由于各种原因用MonoDeveloper.苦于每次上网找各种设置,此处集中写下我用MonoDevel ...
- 企业服务总线ESB
# 企业服务总线ESB 由中间件技术实现并支持SOA的一组基础架构,支持异构环境中的服务.消息以及基于事件的交互,并且具有适当的服务级别和可管理性. 通过使用ESB,可以在几乎不更改代码的情况下,以一 ...
- SQL Operations Studio的安装和使用
之前管理和访问SQL SERVER使用的自然是SSMS,功能确实很强大的一个数据库图形化管理软件,但是SSMS有个问题就是体积超级大,启动速度也就比较慢.今天我正好要学习一些T-SQL的内容,在微软的 ...
- 配置Tomcat使用HTTP/2
转自: https://zhuanlan.zhihu.com/p/21349186 前情提要: Tomcat高效响应的秘密(一) Sendfile与Gzip Tomcat高效响应的秘密(二) keep ...
- C++ 函数 内联函数
内联函数的功能和预处理宏的功能相似,在介绍内联函数之前,先介绍一下预处理宏.宏是简单字符替换,最常见的用法:定义了一个代表某个值的全局符号.定义可调用带参数的宏.作为一种约定,习惯上总是用大写字母来定 ...
- 实验三 Java猜数字游戏开发
课程:Java实验 班级:201352 姓名:程涵 学号:20135210 成绩: 指导教师:娄佳鹏 实验日期:15.06.03 实验密级: ...
- 每日Scrum(10)
今天我们小组整合了下我们所编辑的程序,然后在界面上进行了修改和少部分的完善,现在就等着下午的验收了 任务展板 燃尽图如下:
- 《Spring1之第六次站立会议》
<第六次站立会议> 昨天:向小伙伴们请教了我代码的错误的解决方法以及对TCP/IP协议进行了相关的了解. 今天:我把自己项目工程里的服务器端界面进行了优化和完善. 遇到的问题:觉得做的界面 ...