贴个图

  • 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. 从零开始入门 K8s | 应用编排与管理(酒祝)

    一.需求来源 背景问题 首先来看一下背景问题.如下图所示:如果我们直接管理集群中所有的 Pod,应用 A.B.C 的 Pod,其实是散乱地分布在集群中. 现在有以下的问题: 首先,如何保证集群内可用 ...

  2. 微信小程序中scoll-view的一个小坑

    在微信小程序开发中,有时候swiper-view会出现显示不全的问题,我们可以用scoll-view来把它包裹下,但是要用scoll-view就一定要设置height,而我们经常是在页面中加的这个组件 ...

  3. python的pywinrm模块远程连接windows执行dos命令

    ----A机器远程连接B---- 在A机器上安装模块: pip install pywinrm 在B机器上配置winrm服务的相关配置,使其支持远程控制: (winrm服务是windows 一种方便远 ...

  4. Scrapy项目 - 数据简析 - 实现斗鱼直播网站信息爬取的爬虫设计

    一.数据分析截图(weka数据分析截图 2-3个图,作业文字描述) 本次将所爬取的数据信息,如:房间数,直播类别和人气,导入Weka 3.7工具进行数据分析.有关本次的数据分析详情详见下图所示:   ...

  5. <<构建之法第三版>>读书遇到的5个问题

    1.书中第4章4.5节所说的结对编程让我感觉有一点困惑,书中书写的是结对编程,说实话我是第一次接触这个词汇,我能感到这种方式的新特之处,但是对比我现实的编程经历,我很难想象在一般的企业开发中这样的行为 ...

  6. 基于Docker搭建大数据集群(三)Hadoop部署

    主要内容 Hadoop安装 前提 zookeeper正常使用 JAVA_HOME环境变量 安装包 微云下载 | tar包目录下 Hadoop 2.7.7 角色划分 角色分配 NN DN SNN clu ...

  7. 使用path监听指定文件系统的变化

    在以前的JAVA版本中,如果程序需要检测文件的变化,那么需要开辟一个线程每隔一段时间去遍历一次指定的目录,如果发现此次遍历结果和上次不同,那么就认为文件变动了 ,这样的方式非常繁琐,JAVA 7之后的 ...

  8. Android开发——实现子线程更新UI

    Android中线程按功能分的话,可以分为两个,一个是主线程(UI线程),其他的都是子线程 主线程不能执行那些耗时过长的代码或任务(执行耗时过长的代码会出现应用未响应的提示),所以都是使用子线程来执行 ...

  9. LitePal的查询

    转载:http://blog.csdn.net/guolin_blog/article/details/40153833 传统的查询数据方式 其实最传统的查询数据的方式当然是使用SQL语句了,Andr ...

  10. Android 调用 WebService

    1.WebService简介 PS:如果看完上面简介还不是很清楚的话,那么就算了,之前公司就用C#搭的一个WebService! 本节我们并不讨论如何去搭建一个WebService,我们仅仅知道如何去 ...