垃圾收集器

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

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

并发:值用户线程与垃圾收集线程同时执行(但并不一定是并行的),用户程序在继续运行,而垃圾收集程序运行于另一个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. Beta阶段冲刺集合贴

    第零篇准备博客:https://www.cnblogs.com/coolgirls/p/9066239.html 第一篇冲刺博客:https://www.cnblogs.com/coolgirls/p ...

  2. Jquery 图片走马灯效果原理

    本篇只讲解水平走马灯效果,垂直向上走马灯效果不讲解,原理一样,但是水平走马灯效果有一个小坑.待会讲解 照例先上代码: HTML: <div class="box"> & ...

  3. .Wait()与.GetAwaiter()之间有什么区别

    两者都是同步等待操作的结果差异主要在于处理异常.使用Wait,异常堆栈跟踪不会改变并表示异常时的实际堆栈,因此如果您有一段代码在线程池线程上运行,那么您将拥有类似的堆栈 ThreadPoolThrea ...

  4. [转]data-driven与决策树聚类的两种方法

    参考文章: http://blog.csdn.net/quheDiegooo/article/details/60873999 http://blog.csdn.net/quhediegooo/art ...

  5. 【xsy2332】Randomized Binary Search Tree DP+FFT

    题目大意:给你一个$[0,1]$之间等概率随机序列,你需要把这个序列插入到一棵$treap$中,问这棵$treap$的期望深度,请对于$[1,n]$中的每个深度分别输出它的概率(实数,保留五位小数). ...

  6. 【2019北京集训3】逻辑 树剖+2-sat

    题目大意:有一颗有$m$个叶子节点的二叉树. 对于叶子节点$i$,$x[i]=(a[i]\ xor\ V_{p[i]})or(b[i]\ xor\ V_{q[i]})$ 对于非叶子节点$i$,$x[i ...

  7. hdu 6161--Big binary tree(思维--压缩空间)

    题目链接 Problem Description You are given a complete binary tree with n nodes. The root node is numbere ...

  8. SQL Server性能优化(14)索引碎片

    一. 外部碎片和内部碎片的概念 碎片的概念和检测,参考MSDN:https://msdn.microsoft.com/zh-cn/library/ms189858.aspx 二.对于碎片的解决办法 解 ...

  9. Android应用系列:双击返回键退出程序

    前言 有一个很古老的应用技巧,一直被各种大大小小的app用得乐此不疲,那就是双击返回键退出程序.今天就写写它的实现代码,非常简单而且实用. 正文 双击返回键退出程序,一般有两种实现思路,一种是用一个布 ...

  10. Oracle的数据并发与一致性详解(上)

    今天想了解下oracle中事务与锁的原理,但百度了半天,发现网上介绍的内容要么太短,要么版本太旧,而且抄袭现象严重,所以干脆查官方帮助文档(oracle 11.2),并将其精华整理成中文,供大家一起学 ...