1.垃圾收集器

1.1 Serial收集器

这个收集器是一个单线程的收集器,它在进行垃圾收集时,必须暂停其他所有的工作线程。

它是虚拟机运行在Client模式下的默认新生代收集器,它简单而高效。

1.2 ParNew收集器

其实就是Serial收集器的多线程版本,目前只有它能与CMS收集器配合工作。

1.3 Parallel Scavenge收集器

Parallel Scavenge收集器是一个新生代的收集器,使用复制算法。

它经常被称为“吞吐量优先”的收集器,它的特点就是它的关注点与其他收集器不同,CMS等收集器的关注点是尽可能地缩短垃圾收集时用户线程的停顿时间,而这个收集器的目标则是达到一个可控制的吞吐量。

高吞吐量可以高效率地利用CPU时间,尽快完成程序的运算任务,主要适合在后台运算而不需太多交互的任务。

它还有一个参数-XX:+UseAdaptiveSizePolicy值得关注。这是一个开关参数,当这个参数打开之后,就不需要手工指定新生代的大小(-Xmn)、Eden与Survivor区的比例(-XX:SurvivorRatio)、晋升老年代对象大小(-XX:PretenureSizeThreshold)等细节参数了,虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整这些参数以提供最合适的停顿时间或最大的吞吐量,这种调节方式成为“GC自适应的调节策略(GC Ergonomics)”

1.4 Serial Old收集器

它是Serial的老年代版本,也是一个单线程收集器。使用“标记-整理”算法,在Client模式下的虚拟机使用。

1.5 Parallel Old 收集器

它是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法。主要用于“吞吐量优先”以及CPU资源敏感场合,Parallel Scavenge加Parallel Old收集器可以优先考虑。

1.6 CMS收集器

CMS收集器是一种以获取最短回收停顿时间为目标的收集器。可以使系统停顿时间短,给用户带来较好的体验。

CMS收集器基于“标记-清除”算法实现:

  • 初始标记
  • 并发标记
  • 重新标记
  • 并发清除

其中,初始标记、重新标记这两个步骤仍然需要“Stop The World”。

  1. 初始标记仅仅只是标记一下FC Roots能直接关联到的对象,速度很快
  2. 并发标记阶段就是进行GC Roots Tracing的过程
  3. 重新标记阶段则是为了修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录。
  4. 并发清除与并发标记这两个耗时最长的操作,从总体上说CMS收集器的内存回收过程是与用户线程一起并发执行的。

CMS的缺点

  • CMS收集器对CPU资源非常敏感:当CPU不足四个的时候,对用户程序的影响就很大。因为它要分出一半的运算能力去执行收集器线程。
  • CMS收集器无法处理浮动垃圾,可能出现“Concurrent Mode Failure”失败而导致另外一次Full GC的产生。
  • CMS是一款基于“标记-清除”算法实现的收集器,这就意味着收集结束时会有大量的空间碎片产生。将会给大对象分配带来很大麻烦。

1.7 G1收集器

G1是一款面向服务端应用的垃圾收集器。特点如下:

  • 并行与并发:G1能充分利用多CPU、多核环境下的硬件优势,使用多个CPU来缩短STP停顿时间。
  • 分代收集:G1不需要其他收集器配合就能独立管理整个GC堆,但是它能够采用不同的方式去处理新创建的对象和已经存活的对象。
  • 空间整理:G1从整体看是基于“标记-整理”算法实现的,从局部(两个Region之间)上看是基于“复制”算法实现的。保证G1运作期间不会产生内存空间碎片。
  • 可预测的停顿:可以明确指定在一个长度为M毫秒的时间片段内,消耗在垃圾收集器上时间不得超过N毫秒。

G1讲解:

G1收集器将Java堆的内存分为多个大小相等的独立区域(Region),虽然还保留有新生代和老年代的概念,但新生代和老年代不再是物理隔离的,它们都是Regionde 的集合。G1在后台维护一个优先列表,每次根据允许收集的时间,优先回收最大的Region。

G1运作过程

  • 初始标记:标记GC Roots能直接关联到的对象并且修改TAMS的值,让用户程序并发运行时还能在Region中创建对象,这个阶段需要停顿线程。(耗时较短)
  • 并发标记:从GC Roots中对堆对象进行可达性分析,找出存活对象。但可与用户程序并发执行。(耗时长)
  • 最终标记:修正在并发标记期间因用户程序继续运作而导致标记产生变动的那一部分标记记录。
  • 筛选回收:首先对各个Region的回收价值和成本进行排序,根据用户期望的GC停顿时间来制定回收计划。

《深入理解JAVA虚拟机》----------第三章 垃圾收集器与内存分配策略,笔记(下)的更多相关文章

  1. [Note][深入理解Java虚拟机] 第三章 垃圾收集器与内存分配策略笔记

    书上关于GCTimeRatio的讲解有点难以理解,查看Oracle的文档后重新理解了下 -XX:GCTimeRatio 运行时间 / GC时间 当GCTimeRatio为19时,运行时间是GC时间的1 ...

  2. <<深入Java虚拟机>>-第三章-垃圾收集器与内存分配策略-学习笔记

    垃圾收集 垃圾收集(Garbage Collection,GC),垃圾收集需要完成的三件事情. 哪些对象需要回收 什么时候回收 如何回收 如何确定对象已死(即不可能在被任何途径引用的对象) 引用计数算 ...

  3. [深入理解JVM虚拟机]第3章-垃圾收集器、内存分配策略

    垃圾收集器 判断对象是否需存活 回收堆 判断对象是否存活: 方法一:引用计数法.对象被引用一次就+1,当为0时回收对象.缺点:无法解决循环引用问题. 方法二:可达性分析算法.记录当前对象是否有和GC ...

  4. 深入理解java虚拟机(2)------垃圾收集器和内存分配策略

    GC可谓是java相较于C++语言,最大的不同点之一. 1.GC回收什么? 上一篇讲了内存的分布. 其中程序计数器栈,虚拟机栈,本地方法栈 3个区域随着线程而生,随着线程而死.这些栈的内存,可以理解为 ...

  5. 《深入理解java虚拟机》第三章 垃圾收集器与内存分配策略

    第三章 垃圾收集器与内存分配策略 3.1 概述 哪些内存需要回收 何时回收 如何回收 程序计数器.虚拟机栈.本地方法栈3个区域随线程而生灭. java堆和方法区的内存需要回收.   3.2 对象已死吗 ...

  6. JVM学习笔记-第三章-垃圾收集器与内存分配策略

    JVM学习笔记-第三章-垃圾收集器与内存分配策略 tips:对于3.4之前的章节可见博客:https://blog.csdn.net/sanhewuyang/article/details/95380 ...

  7. 深入了解Java虚拟机(2)垃圾收集器与内存分配策略

    垃圾收集器与内存分配策略 由于JVM中对象的频繁操作是在堆中,所以主要回收的是堆内存,方法区中的回收也有,但是比较谨慎 一.对象死亡判断方法 1.引用计数法 就是如果对象被引用一次,就给计数器+1,否 ...

  8. 读书笔记,《深入理解java虚拟机》,第三章 垃圾收集器与内存分配策略

    要实现虚拟机,其实人们主要考虑完成三件事情: 第一,哪些内存需要回收: 第二,什么时候回收: 第三,如何回收. 第二节,对象已死吗    垃圾收集其实主要是针对java堆里面的数据来说的,传统的垃圾收 ...

  9. 深入理解Java虚拟机 第三章 垃圾收集器 笔记

    1.1   垃圾收集器 垃圾收集器是内存回收的具体实现.以下讨论的收集器是基于JDK1.7Update14之后的HotSpot虚拟机.这个虚拟机包含的所有收集器有: 上图展示了7种作用于不同分代的收集 ...

随机推荐

  1. 将任何GitHub内的代码转为外部CDN网址

    rawgit.com 有时候在GitHub找到需要使用于网站的档案(例如:CSS.JavaScript),但没有提供CDN网址就必须自己手动下载.上传到主机上才能够使用,有点耗时又不方便,因为GitH ...

  2. 为DOM节点添加或者删除class

    项目中如果应用了常用的javascript类库,多数情况下,这些已经封装好的类库,都会封装一个类似于addClass和removeClass的方法,以便于我们对DOM节点的class进行操作. 以jQ ...

  3. ROS-by-example的安装

    在这里我之前用的VM12安装成功之后,仿真器机器人会有问题,故把电脑做成双系统的形式来重新安装: 环境:Ubuntu14.04 LTS 32bits ROS版本:ROS Indigo 在学习本部分之后 ...

  4. python学习笔记_week4

    装饰器: 定义:本质是函数,(装饰其他函数)就是为其他函数添加附加功能 原则:1.不能修改被装饰的函数的源代码 2.不能修改被装饰的函数的调用方式 实现装饰器知识储备: 1.函数即“变量” impor ...

  5. Hessian 源码简单分析

    Hessian 是一个rpc框架, 我们需要先写一个服务端, 然后在客户端远程的调用它即可. 服务端: 服务端通常和spring 做集成. 首先写一个接口: public interface Hell ...

  6. 10. js截取最后一个斜杠后面的字符串

    var startIndex = filePath.lastIndexOf("\\"); endIndex = filePath.lastIndexOf("." ...

  7. leetcode1018

    根据题目的hint,使用单层循环计算: class Solution(object): def prefixesDivBy5(self, A: 'List[int]') -> 'List[boo ...

  8. TWebBrowser禁止弹出Alert对话框

    以前介绍过通过编写Webbrowser1的OnDocumentComplete事件响应代码可以拦截网页弹出的Alert等对话框,代码如下: procedure TForm1.WebBrowser1Do ...

  9. html 自定义属性的获取和应用

    在html 中,我们可以给元素设置自定义属性,格式:  data-属性="属性值",可以设置一个,也可以设置多个 1.获取元素属性的常规方法:直接获取元素,然后使用getAttri ...

  10. open read split

    open  来打开文件, 其具体表现为 open('文件名或路径', 'r or w or other', 位置?) 其生成一个文件类型的对象 file object. 可写做 FILENAME = ...