垃圾收集器

手机算法是内存回收的方法论,垃圾收集器是内存回收的具体实现。

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

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

Serial收集器

单线程收集器,也就是说是必须停止所有的工作线程,知道垃圾收集完毕。对于单CPU来说更加高效。所以适合运行于Client模式下的虚拟机。

新生代采用复制算法。老年代采用标记整理算法。

ParNew收集器

是Serial的多线程版本(看图的话是在新生代多线程同时进行GC)。是GC线程有多个,所有其他工作线程都停止。多线程GC会有线程间交互这种上下文切换的效率损失。

新生代采用复制算法。老年代采用标记整理算法。

Parallel Scavenge收集器

多线程同时GC。这款收集器的目的是更高的吞吐量。是吞吐量优先收集器,高吞吐量会使得GC停顿时间变长。但总体的用户运行代码时间变多了。吞吐量:运行用户代码时间/(运行用户代码时间+垃圾收集时间)

该收集器既可以自动调节也可以通过手动配置来优化收集过程。

Serial Old收集器

单线程收集器,标记整理算法。是Serial的老年代版本。

Parallel Old收集器

是Parallel Scavenge收集器的老年代版本 标记整理算法。

解决了只能和Serial Old收集器搭配的尴尬境地。

CMS收集器

Concurrent Mark Sweep 收集器是以获取最短回收停顿时间为目的的收集器。B/S应用关注用户的体验,更短的响应时间。CMS这点很适合。

从名字来看,并发标记清除。是一款可以和用户线程并发的收集器。

分为四个步骤:初始标记、并发标记、重新标记、并发清除。其中初始标记和重新标记需要stop the world,也就是停止其他工作线程。

初始标记步骤标记所有GC Roots直接关联到的对象,速度很快,并发标记阶段就是进行GC Roots Tracing(追踪)的过程。重新标记是修正并发标记阶段用户线程继续运行而发生的改变。并发清除就不用说了。

整个过程最耗时的追踪和清除实现了并发。而标记GC Roots和重新标记耗时很短。

缺点:1、占用用户线程的CPU。影响用户体验。占用线程数为(CPU数量+3)/4,CPU越多占用的越少。

   2、无法处理浮动垃圾,所以老年代要预留空间。可以上调老年代GC阈值来调优,但是太高会造成“Concurrent Mode Failure”失败。造成启用备用方案Serial Old来GC老年代,造成长时间停顿。反而降低性能

   3、标记清除会造成老年代空间碎片太多,如果有大对象会引发Full GC。默认是每次Full GC都进行整理,可以设置次数来优化。(如果程序涉及大对象就多整理,如果不涉及就可以很少的整理)

G1收集器

特点:

  1、并发与并行

  2、分代收集 (所有收集器都是分代的)

  3、空间整合

  4、可预测的停顿

Garbage First收集器是整堆收集器。虽然还保留新生代和老年代的概念,但是他们都是一部分Region的集合,而不再有物理隔离。

深入理解Java虚拟机--阅读笔记三的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

  7. 深入理解Java虚拟机阅读心得(三)

    Java中提倡的自动内存管理最终可以归结为自动化的解决两个问题: 给对象分配内存 回收分配给对象的内存 先说说回收这一方面的两个主要知识点 一.垃圾收集算法 1.标记-清理算法 首先标记出所有需要回收 ...

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

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

  9. 深入理解JAVA虚拟机阅读笔记3——垃圾回收器

    一.垃圾收集器总览 新生代:Serial. ParNew. Parallel Scavenge 老年代:CMS.Serial Old. Parallel Old 最新的:G1 并行和并发的区别: 并行 ...

随机推荐

  1. python之路(六)-函数相关

    在没有学习函数之前我们的程序是面向过程的,不停的判断,不停的循环,同样的代码重复出现在我们的代码里.函数可以更好的提高我们的 代码质量,避免同样的代码重复出现,而只需要在用的时候调用函数即可执行.此为 ...

  2. _ZNote_Qt_Tips_添加动态链接库

    之前添加都是 手写添加,今天陈老师提示可以在 .pro 文件内空白处,右键弹出添加

  3. C/C++ 的宏中#和##的作用和展开

    C/C++ 的宏中: (1) # 的功能是将其后面的宏参数进行字符串化操作,简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号. 也就是说: #define __TO_STRING_IM ...

  4. Codeforces Round #512 E - Vasya and Good Sequences

    有时候觉得自己就是个思路搬运机,只会搬运思路 这个题首先说了求的是好区间的个数,  好区间满足条件: 1.二进制位1的数量和为偶数    2.w[i]表示a[i]的二进制上1的个数 ,sum[i] = ...

  5. Js表单验证控件-02 Ajax验证

    在<Js表单验证控件(使用方便,无需编码)-01使用说明>中,写了Verify.js验证控件的基本用法,基本可以满足大多数验证需求,如果涉及服务端的验证,则可以通过Ajax. Ajax验证 ...

  6. VB.NET 定义多行文本字符的几种方式

    vbCrLf 在 .NET 刚刚推出的时候,VB作为一款被微软用来"衬托"C#的语言,在许多细节设计上远不如C#方便. 比如在C#中写一个多行文本,就有各种方式: string s ...

  7. Spring AOP的实现及源码解析

    在介绍AOP之前,想必很多人都听说AOP是基于动态代理和反射来实现的,那么在看AOP之前,你需要弄懂什么是动态代理和反射及它们又是如何实现的. 想了解JDK的动态代理及反射的实现和源码分析,请参见下面 ...

  8. 从小白到使用antd+react+react-router+issue+es6搭建博客

    概述 本身是前端小白,学过html,css,js的各种书,各种视屏,就是没有接触web开发的内容.偶然看见一个朋友用react搭建了一个博客,于是本着程序员无所不能的精神,也尝试着用react搭建博客 ...

  9. jQuery事件委托

    jQuery事件委托 <ul id="ulBox"> <li data-id="1"></li> <li data-i ...

  10. Linux学习笔记之三————Linux命令概述

    一.引言 很多人可能在电视或电影中看到过类似的场景,黑客面对一个黑色的屏幕,上面飘着密密麻麻的字符,梆梆一顿敲,就完成了窃取资料的任务. Linux 刚出世时没有什么图形界面,所有的操作全靠命令完成, ...