1, 串行回收器

1.1, 新生代串行回收器

(1)特点: 
  –它仅仅使用单线程进行垃圾回收 
  –它是独占式的垃圾回收 
  –进行垃圾回收时, Java应用程序中的线程都需要暂停(Stop-The-World) 
  –使用复制算法 
  –适合CPU等硬件不是很好的场合 
(2)设置参数: 
  -XX:+UseSerialGC 指定新生使用新生代串行收集器和老年代串行收集器, 当以client模式运行时, 它是默认的垃圾收集器

1.2, 老年代串行回收器

(1)特点: 
  –同新生代串行回收器一样, 单线程, 独占式的垃圾回收器 
  –通常老年代垃圾回收比新生代回收要更长时间, 所以可能会使应用程序停顿较长时间 
(2)设置参数: 
  -XX:+UseSerialGC 新生代, 老年代都使用串行回收器 
  -XX:+UseParNeGC 新生代使用ParNew回收器, 老年代使用串行回收器 
  -XX:+UseParallelGC 新生代使用ParallelGC回收器, 老年代使用串行回收器


2, 并行回收器

2.1, 新生代ParNew回收器

(1)特点: 
  –将串行回收多线程化, 
  –使用复制算法 
  –垃圾回收时, 应用程序仍会暂停, 只不过由于是多线程回收, 在多核CPU上,回收效率会高于串行回收器, 反之在单核CPU, 效率会不如串行回收器 
(2)设置参数: 
  -XX:+UseParNewGC 新生代使用ParNew回收器, 老年代使用串行回收器 
  -XX:+UseConcMarkSweepGC 新生代使用ParNew回收器, 老年代使用CMS回收器 
  -XX:ParallelGCThreads=n 指回ParNew回收器工作时的线程数量, cpu核数小时8时, 其值等于cpu数量, 高于8时,可以使用公式(3+((5*CPU_count)/8))

2.2, 新生代ParallelGC回收器

(1)特点: 
  –同ParNew回收器一样, 不同的地方在于,它非常关注系统的吞吐量(通过参数控制) 
  –使用复制算法 
  –支持自适应的GC调节策略

(3)设置参数:

  -XX:+UseParallelGC  新生代用ParallelGC回收器, 老年代使用串行回收器 
  -XX:+UseParallelOldGC  新生代用ParallelGC回收器, 老年代使用ParallelOldGC回收器系统吞吐量的控制: 
  -XX:MaxGCPauseMillis=n(单位ms)   设置垃圾回收的最大停顿时间, 
  -XX:GCTimeRatio=n(n在0-100之间)  设置吞吐量的大小, 假设值为n, 那系统将花费不超过1/(n+1)的时间用于垃圾回收 
  -XX:+UseAdaptiveSizePolicy  打开自适应GC策略, 在这种模式下, 新生代的大小, eden,survivior的比例, 晋升老年代的对象年龄等参数会被自动调整,以达到堆大小, 吞吐量, 停顿时间之间的平衡点

2.3, 老年代ParallelOldGC回收器

(1)特点: 
  –同新生代的ParallelGC回收器一样, 是属于老年代的关注吞吐量的多线程并发回收器 
  –使用标记压缩算法, 
(2)设置参数: 
  -XX:+UseParallelOldGC  新生代用ParallelGC回收器, 老年代使用ParallelOldGC回收器, 是非常关注系统吞吐量的回收器组合, 适合用于对吞吐量要求较高的系统 
  -XX:ParallelGCThreads=n   指回ParNew回收器工作时的线程数量, cpu核数小时8时, 其值等于cpu数量, 高于8时, 可以使用公式(3+((5*CPU_count)/8))


3, CMS回收器(Concurrent Mark Sweep,并发标记清除)

3.1, 老年代的并发回收器

(1)特点: 
  –是并发回收, 非独占式的回收器, 大部分时候应用程序不会停止运行 
  –针对年老代的回收器, 
  –使用并发标记清除算法, 因此回收后会有内存碎片, 可以使参数设置进行内存碎片的压缩整理 
  –与ParallelGC和ParallelOldGC不同, CMS主要关注系统停顿时间 
(2)CMS主要步骤: 
  1. 初始标记 
  2. 并发标记 
  3. 预清理 
  4. 重新标记 
  5. 并发清理 
  6. 并发重置

–>注:初始标记与理新标记是独占系统资源的,不能与用户线程一起执行,而其它阶段则可以与用户线程一起执行 
(3)设置参数: 
  -XX:-CMSPrecleaningEnabled  关闭预清理, 不进行预清理, 默认在并发标记后, 会有一个预清理的操作,可减少停顿时间 
  -XX:+UseConcMarkSweepGC  老年代使用CMS回收器, 新生代使用ParNew回收器 
  -XX:ConcGCThreads=n  设置并发线程数量, 
  -XX:ParallelCMSThreads=n  同上, 设置并发线程数量, 
  -XX:CMSInitiatingOccupancyFraction=n  指定老年代回收阀值, 即当老年代内存使用率达到这个值时, 会执行一次CMS回收,默认值为68, 设置技巧: (Xmx-Xmn)*(100-CMSInitiatingOccupancyFraction)/100)>=Xmn 
  -XX:+UseCMSCompactAtFullCollection  开启内存碎片的整理, 即当CMS垃圾回收完成后, 进行一次内存碎片整理, 要注意内存碎片的整理并不是并发进行的, 因此可能会引起程序停顿 
  -XX:CMSFullGCsBeforeCompation=n  用于指定进行多少次CMS回收后, 再进行一次内存压缩 
  -XX:+CMSParallelRemarkEnabled  在使用UseParNewGC 的情况下, 尽量减少 mark 的时间 
  -XX:+UseCMSInitiatingOccupancyOnly  表示只有达到阀值时才进行CMS回收

3.2, Class的回收(永久区的回收)

设置参数: 
  -XX:+CMSClassUnloadingEnabled  开启回收Perm区的内存, 默认情况下, 是需要触发一次FullGC 
  -XX:CMSInitiatingPermOccupancyFraction=n  当永久区占用率达到这个n值时,启动CMS回收, 需上一个参数开启的情况下使用


4, G1回收器(jdk1.7后全新的回收器, 用于取代CMS)

(1)特点: 
  –独特的垃圾回收策略, 属于分代垃圾回收器, 
  –使用分区算法, 不要求eden, 年轻代或老年代的空间都连续 
  –并行性: 回收期间, 可由多个线程同时工作, 有效利用多核cpu资源 
  –并发性: 与应用程序可交替执行, 部分工作可以和应用程序同时执行, 
  –分代GC: 分代收集器, 同时兼顾年轻代和老年代 
  –空间整理: 回收过程中, 会进行适当对象移动, 减少空间碎片 
  –可预见性: G1可选取部分区域进行回收, 可以缩小回收范围, 减少全局停顿 
(2)G1的收集过程 
1. 新生代GC: 
2. 并发标记周期: 
  –初始标记新生代GC(此时是并行, 应用程序会暂停止)–>根区域扫描–>并发标记–>重新标记(此时是并行, 应用程序会暂停止)–>独占清理(此时应用程序会暂停止)–>并发清理 
3. 混合回收: 
  –这个阶段即会执行正常的年轻代gc, 也会选取一些被标记的老年代区域进行回收, 同时处理新生代和年老轻 
4. 若需要, 会进行FullGC: 
  –混合GC时发生空间不足 
  –在新生代GC时, survivor区和老年代无法容纳幸存对象时, 
  –以上两者都会导致一次FullGC产生 
(3)设置参数: 
  -XX:+UseG1GC  打开G1收集器开关, 
  -XX:MaxGCPauseMillis=n  指定目标的最大停顿时间,任何一次停顿时间超过这个值, G1就会尝试调整新生代和老年代的比例, 调整堆大小, 调整晋升年龄 
  -XX:ParallelGCThreads=n  用于设置并行回收时, GC的工作线程数量 
  -XX:InitiatingHeapOccpancyPercent=n  指定整个堆的使用率达到多少时, 执行一次并发标记周期, 默认45, 过大会导致并发标记周期迟迟不能启动, 增加FullGC的可能, 过小会导致GC频繁, 会导致应用程序性能有所下降


5, 其他GC相关的设置

5.1, System.gc()

(1)禁用System.gc() 
  -XX:+DisableExplicitGC  禁止程序中调用System.gc(), 加了此参数, 程序若有调用, 返回的空函数调用 
   System.gc()的调用, 会使用FullGC的方式回收整个堆而会忽略CMS或G1等相关回收器 
(2)System.gc()使用并发回收 
  -XX:+ExplicitGCCinvokesConcurrent   使用并发方式处理显示的gc, 即开启后, System.gc()这种显示GC才会并发的回收, (CMS, G1)

5.2, 并行GC前额外触发的新生代GC

(1)使用并行回收器(UseParallelGC或者UseParallelOldGC)时, 会额外先触发一个新生代GC, 目的是尽可能减少停顿时间 
(2)若不需要这种特性, 可以使用以下参数去除 
  -XX:-ScavengeBeforeFullGC   即去除在FullGC之前的那次新生代GC, 原本默认值为true 
  

5.3, 对象何时进入老年代

(1)当对象首次创建时, 会放在新生代的eden区, 若没有GC的介入,会一直在eden区, GC后,是可能进入survivor区或者年老代 
(2)当对象年龄达到一定的大小 ,就会离开年轻代, 进入老年代, 对象进入老年代的事件称为晋升, 而对象的年龄是由GC的次数决定的, 每一次GC,若对象没有被回收, 则对象的年龄就会加1, 可以使用以下参数来控制新生代对象的最大年龄: 
  -XX:MaxTenuringThreshold=n  假设值为n , 则新生代的对象最多经历n次GC, 就能晋升到老年代, 但这个必不是晋升的必要条件 
  -XX:TargetSurvivorRatio=n  用于设置Survivor区的目标使用率,即当survivor区GC后使用率超过这个值, 就可能会使用较小的年龄作为晋升年龄 
(3)除年龄外, 对象体积也会影响对象的晋升的, 若对象体积太大, 新生代无法容纳这个对象, 则这个对象可能就会直接晋升至老年代, 可通过以下参数使用对象直接晋升至老年代的阈值, 单位是byte 
  -XX:PretenureSizeThreshold  即对象的大小大于此值, 就会绕过新生代, 直接在老年代分配, 此参数只对串行回收器以及ParNew回收有效, 而对ParallelGC回收器无效,

5.4, 在TLAB上分配对象(Thread Local Allocation Buffer, 线程本地分配缓存)

(1)TLAB: TLAB是一个线程专用的内存分配区域, 虚拟机为线程分配空间, 针对于体积不大的对象, 会优先使用TLAB, 这个可以加速对象的分配, TLAB是默认开启的, 若要关闭可以使用以下参数关闭 
  -XX:-UseTLAB  关闭TLAB 
  -XX:+UseTLAB  开启TLAB, 默认也是开启的 
  -XX:+PrintTLAB  观察TALB的使用情况 
  -XX:TLABRefillWasteFraction=n  设置一个比率n, 而refill_waste的值就是(TLAB_SIZE/n), 即TLAB空间较小, 大对象无法分配在TLAB,所以会直接分配到堆上,TLAB较小也很容易装满, 因此当TLAB的空间不够分配一个新对象, 就会考虑废弃当前TLAB空间还是直接分配到堆上, 就会使用此参数进行判断, 小于refill_waste就允许废弃, 而新建TLAB来分配对象,而大于refill_waste就直接在堆上分配, 默认是64 
  -XX:+ResizeTLAB  开启TLAB自动调整大小, 默认是开启的, 若要关闭把+号换成-号即可 
  -XX:TLABSize=n  设置一个TLAB的大小, 前提先关闭TLAB的自动调整

Jvm垃圾回收器详细的更多相关文章

  1. Jvm垃圾回收器(终结篇)

    知识回顾: 第一篇<Jvm垃圾回收器(基础篇)>主要讲述了判断对象的生死?两种基础判断对象生死的算法.引用计数法.可达性分析算法,方法区的回收.在第二篇<Jvm垃圾回收器(算法篇)& ...

  2. Jvm垃圾回收器(算法篇)

    在<Jvm垃圾回收器(基础篇)>中我们主要学习了判断对象是否存活还是死亡?两种基础的垃圾回收算法:引用计数法.可达性分析算法.以及Java引用的4种分类:强引用.软引用.弱引用.虚引用.和 ...

  3. JVM 垃圾回收器工作原理及使用实例介绍(转载自IBM),直接复制粘贴,需要原文戳链接

    原文 https://www.ibm.com/developerworks/cn/java/j-lo-JVMGarbageCollection/ 再插一个关于线程和进程上下文,待判断 http://b ...

  4. JVM基础系列第9讲:JVM垃圾回收器

    前面文章中,我们介绍了 Java 虚拟机的内存结构,Java 虚拟机的垃圾回收机制,那么这篇文章我们说说具体执行垃圾回收的垃圾回收器. 总的来说,Java 虚拟机的垃圾回收器可以分为四大类别:串行回收 ...

  5. 【转】Java学习---垃圾回收算法与 JVM 垃圾回收器综述

    [原文]https://www.toutiao.com/i6593931841462338062/ 垃圾回收算法与 JVM 垃圾回收器综述 我们常说的垃圾回收算法可以分为两部分:对象的查找算法与真正的 ...

  6. 垃圾回收算法与 JVM 垃圾回收器综述(转)

    垃圾回收算法与 JVM 垃圾回收器综述 我们常说的垃圾回收算法可以分为两部分:对象的查找算法与真正的回收方法.不同回收器的实现细节各有不同,但总的来说基本所有的回收器都会关注如下两个方面:找出所有的存 ...

  7. JVM垃圾回收器原理及使用介绍

    JVM垃圾回收器原理及使用介绍 垃圾收集基础 引用计数法(Reference Counting) 标记-清除算法(Mark-Sweep) 复制算法(Copying) 标记-压缩算法(Mark-Comp ...

  8. jvm垃圾回收器介绍

    上篇文章中我们讨论了jvm的内存区域,这篇文章我们来讨论针对的内存区域的垃圾回收机制. 其实针对垃圾回收我们通常考虑三个问题:1.哪些内存需要回收?2.什么时候回收?3.如何回收?下面我们针对这三个问 ...

  9. 7种jvm垃圾回收器,这次全部搞懂

    前言 之前我们讲解了jvm的组成结构与垃圾回收算法等知识点,今天我们来讲讲jvm最重要的堆内存是如何使用垃圾回收器进行垃圾回收,并且如何使用命令去配置使用这些垃圾回收器. 堆内存详解 上面这个图大家应 ...

随机推荐

  1. SPFA算法 - Bellman-ford算法的进一步优化

    2017-07-27  22:18:11 writer:pprp SPFA算法实质与Bellman-Ford算法的实质一样,每次都要去更新最短路径的估计值. 优化:只有那些在前一遍松弛中改变了距离点的 ...

  2. Delphi_时间间隔

    1. var dtOnlineDateTime, dt: TDateTime; begin dt := StrToDateTime('2017/6/28 16:41:30'); dtOnlineDat ...

  3. 利用 innodb_force_recovery 解决MySQL服务器crash无法重启问题

    背景      MySQL服务器因为磁盘阵列损坏机器crash,重启MySQL服务时 报如下错误: InnoDB: Reading tablespace information from the .i ...

  4. New Concept English three (43)

    30 54 Insurance companies are normally willing to insure anything. Insuring public or private proper ...

  5. 【tensorflow:Google】二、Tensorflow环境搭建

    2.1 Tensorflow 主要依赖包 2.1.1 Protocol Buffer 结构化数据序列化的过程,另外的工具:XML, JSON, 区别:二进制(不可读):先定义数据格式,还原的时候将需要 ...

  6. File I/O的总结

    1读写字符文件 BufferedReader br=new BufferedReader(new FileReader("文件路径")); BufferedWriter bw=ne ...

  7. [Mvel]Mvel2.0使用指南一 基础

    MVEL在很大程度上受到Java语法的启发,作为一个表达式语言,也有一些根本的区别,旨在更高的效率,例如:直接支持集合.数组和字符串匹配等操作以及正则表达式. MVEL用于执行使用Java语法编写的表 ...

  8. 开源项目Universal Image Loader for Android 说明文档 (1) 简介

     When developing applications for Android, one often facesthe problem of displaying some graphical ...

  9. linux常用开发工具命令行

  10. Go标准容器之List

    简介Go的标准包container中包含了常用的容器类型,包括conatiner/list,container/heap,container/ring.本篇介绍conatiner/list. cona ...