贴个图

  • Serial收集器

    最简单的收集器,单线程,收集器会暂停用户线程,称为"stop the world"。

  • ParNew收集器

    Serial收集器的多线程版本,其它类似。默认线程数为CPU线程数,通过-XX:ParallelGCThreads=? 可以指定线程数

  • Parallel Scavenge收集器

    复制算法,多线程收集器。与ParNew的区别在于,该收集器关注系统吞吐量(吞吐量=用户运行时间/(用户运行时间+垃圾回收时间))。通过-XX:MaxGCPauseMillis 设置垃圾回收时间,数组太小将导致垃圾回收不完全,从而GC频率变高。通关-XX:GCTimeRatio 设置垃圾回收时间和运行时间之比,默认值为99,即允许1%(1/(1+99))。

  • Serial Old 收集器

    Serial 收集器的老生代版本,才用标记-整理算法。

  • Parallel Old收集器

    Parallel Scavenge的老生代版本,采用标记-整理算法。

  • CMS(Concurrent Mark Sweep)

    CMS是一种获取最短时间停顿为目标的收集器。采用标记-整理算法,但是比上述的更为复杂。

    • 初始标记(CMS initial mark)
    • 并发标记(CMS concurrent mark)
    • 重新标记(CMS remark)
    • 并发清除(CMS concurrent sweep)

    CMS是一个优秀的垃圾收集器,并发收集,低停顿。但是也有3个显著的缺点:

    • CMS收集器对CPU资源非常敏感。在并发阶段,虽然不会导致用户进程停顿,但还是会占用部分CPU,导致吞吐量变低。CMS默认启动的回收线程数为(CPU数量+3)/4,
    • CMS无法清理浮动垃圾,简单说就是在并发阶段,用户程序产生的新的垃圾无法被回收。这因为如此,所以在进行垃圾清理时,内存必须还留有空间给用户线程使用,在默认情况下,CMS收集器会在老生代使用了68%的空间后被激活。可以通过-XX:CMSInitiatingOccupancyFraction 来设置这个值。假如CMS回收期间,预留空间无法满足使用,则会引发“concurrent mode failure”,这时虚拟机会启动备案:临时使用Serial来收集垃圾,这会让停顿时间更长。
    • CMS是基于标记-清理算法的,所以会导致大量的内存碎片。
  • G1收集器

    ​ G1收集器是当前最厉害的垃圾收集器,简单来说就是Parallel Scavenge的升级版。

    G1收集器采用标记-整理算法,不会产生内存碎片。而且G1收集器可以精确的控制停顿,能让使用者设置一个M毫秒的时间段,垃圾回收时间一定会在M毫秒内。

    ​ G1收集器可以实现在基本不牺牲吞吐量的前提下低停顿完成垃圾回收,是因为它能够极力地避免全区域的垃圾回收。G1收集器将堆(包括新生代,老生代)划分为多个区块,并生成一个优先级列表,优先回收垃圾最多的区块。

JVM学习记录3--垃圾收集器的更多相关文章

  1. JVM学习笔记——GC垃圾收集器

    GC 垃圾收集器 Java 堆内存采用分代回收算法,因此 JVM 针对新生代和老年代提供了多种垃圾收集器. 1. Serial 收集器 Serial 收集器是单线程收集器,采用复制算法. 是最基本的垃 ...

  2. JVM的7种垃圾收集器:主要特点 应用场景 设置参数 基本运行原理

    原文地址:https://blog.csdn.net/tjiyu/article/details/53983650 下面先来了解HotSpot虚拟机中的7种垃圾收集器:Serial.ParNew.Pa ...

  3. Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论

    Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论 创建用户自定义的类加载器 要创建用户自定义的类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的f ...

  4. java之jvm学习笔记四(安全管理器)

    java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...

  5. JVM系列三(垃圾收集器).

    一.概述 1. 哪些内存需要回收 上篇文章 我们介绍了 Java 内存运行时区域的各个部分,其中程序计数器.虚拟机栈.本地方法栈三个区域随线程而生,随线程而灭,在这几个区域内就不需要过多考虑回收的问题 ...

  6. JVM学习记录-垃圾收集器

    先回顾一下上一篇介绍的JVM中常见几种垃圾收集算法: 标记-清除算法(Mark-Sweep). 复制算法(Copying). 标记整理算法(Mark-Compact). 分代收集算法(Generati ...

  7. JVM学习记录

    本博客是为了自己学习JVM而建立,只记录一些自己学习的经过. 最近在看<深入理解Java虚拟机>这本书,里面的内容,很是乏味,因为看不懂所以就会觉得很枯燥,觉得很枯燥看着看着就犯困,然后就 ...

  8. JVM之几种垃圾收集器简单介绍

    本文中的垃圾收集器研究背景为:HotSpot+JDK1.7 一.垃圾收集器概述 如上图所示,垃圾回收算法一共有7个,3个属于年轻代.三个属于年老代,G1属于横跨年轻代和年老代的算法. JVM会从年轻代 ...

  9. jvm学习记录-对象的创建、对象的内存布局、对象的访问定位

    简述 今天继续写<深入理解java虚拟机>的对象创建的理解.这次和上次隔的时间有些长,是因为有些东西确实不好理解,就查阅各种资料,然后弄明白了才来做记录. (此文中所阐述的内容都是以Hot ...

随机推荐

  1. JAVA设计模式-动态代理(Proxy)源码分析

    在文章:JAVA设计模式-动态代理(Proxy)示例及说明中,为动态代理设计模式举了一个小小的例子,那么这篇文章就来分析一下源码的实现. 一,Proxy.newProxyInstance方法 @Cal ...

  2. 客户端与服务端的事件watcher源码阅读

    watcher存在的必要性 举个特容易懂的例子: 假如我的项目是基于dubbo+zookeeper搭建的分布式项目, 我有三个功能相同的服务提供者,用zookeeper当成注册中心,我的三个项目得注册 ...

  3. APP功能测试要点

    1.功能性测试 根据产品需求文档编写测试用例而进行测试,包括客户端的单个功能模块以及功能业务逻辑(功能交互)如:涉及输入的地方需要考虑等价类,边界值,异常或非法等 1.1 安装与卸载测试 >软件 ...

  4. Python+OpenCV竖版古籍文字分割

    在做图片文字分割的时候,常用的方法有两种.一种是投影法,适用于排版工整,字间距行间距比较宽裕的图像:还有一种是用OpenCV的轮廓检测,适用于文字不规则排列的图像. 1. 思路 一开始想偷个懒,直接用 ...

  5. 基于操作系统原理的Linux 的用户管理

    一.实验目的 1.掌握为root用户修改密码的方法. 2.掌握创建新用户的方法. 3.掌握用户组的管理方法. 4.掌握为用户授权的方法. 二.实验内容 1.Linux的用户管理 (1)创建新用户创建新 ...

  6. SpringBoot集成Spring Security入门体验

    一.前言 Spring Security 和 Apache Shiro 都是安全框架,为Java应用程序提供身份认证和授权. 二者区别 Spring Security:重量级安全框架 Apache S ...

  7. Spring boot 梳理 - WebMvcConfigurer接口 使用案例

    转:https://yq.aliyun.com/articles/617307 SpringBoot 确实为我们做了很多事情, 但有时候我们想要自己定义一些Handler,Interceptor,Vi ...

  8. Spring MVC-从零开始-@RequestMapping结合@RequestParam (从HTTP键值对中取值,作用于函数参数)

    1.@RequestParam 注解使用的时候可以有一个值,也可以没有值:如果请求参数和处理方法参数的名称一样的话,@RequestParam 注解的 value 这个参数就可省掉了:@Request ...

  9. 正睿OI DAY3 杂题选讲

    正睿OI DAY3 杂题选讲 CodeChef MSTONES n个点,可以构造7条直线使得每个点都在直线上,找到一条直线使得上面的点最多 随机化算法,check到答案的概率为\(1/49\) \(n ...

  10. PHP生成唯一ID的方法

    PHP自带生成唯一id的函数:uniqid() 它是基于当前时间微秒数的 用法如下: echo uniqid(); //13位的字符串 echo uniqid("php_"); / ...