今天继续JVM的垃圾回收器详解,如果说垃圾收集算法是JVM内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。
  
  一、常见的垃圾收集器有3类
  
  1.新生代的收集器包括
  
  Serial
  
  PraNew
  
  Parallel Scavenge
  
  2.老年代的收集器包括
  
  Serial Old
  
  Parallel Old
  
  CMS
  
  3.回收整个Java堆(新生代和老年代)
  
  G1收集器
  
  今天我们详细谈谈以上7种垃圾收集器的优劣势和使用场景。
  
  新生代垃圾收集器
  
  1.Serial串行收集器-复制算法
  
  Serial收集器是新生代单线程收集器,优点是简单高效,算是最基本、发展历史最悠久的收集器。它在进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集完成。
  
  Serial收集器依然是虚拟机运行在Client模式下默认新生代收集器,对于运行在Client模式下的虚拟机来说是一个很好的选择。
  
  2.ParNew收集器-复制算法
  
  ParNew收集器是新生代并行收集器,其实就是Serial收集器的多线程版本。
  
  除了使用多线程进行垃圾收集之外,其余行为包括Serial收集器可用的所有控制参数、收集算法、Stop The Worl、对象分配规则、回收策略等都与Serial 收集器完全一样。
  
  3.Parallel Scavenge(并行回收)收集器-复制算法
  
  Parallel Scavenge收集器是新生代并行收集器,追求高吞吐量,高效利用 CPU。
  
  该收集器的目标是达到一个可控制的吞吐量(Throughput)。所谓吞吐量就是CPU用于运行用户代码的时间与CPU总消耗时间的比值,即 吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)
  
  停顿时间越短就越适合需要与用户交互的程序,良好的响应速度能提升用户体验,而高吞吐量则可用高效率地利用CPU时间,尽快完成程序的运算任务,主要适合在后台运算而不需要太多交互的任务。
  
  老年代垃圾收集器
  
  1.Serial Old 收集器-标记整理算法
  
  Serial Old是Serial收集器的老年代版本,它同样是一个单线程(串行)收集器,使用标记整理算法。这个收集器的主要意义也是在于给Client模式下的虚拟机使用。
  
  如果在Server模式下,主要两大用途:
  
  (1)在JDK1.5以及之前的版本中与Parallel Scavenge收集器搭配使用
  
  (2)作为CMS收集器的后备预案,在并发收集发生Concurrent Mode Failure时使用
  
  2.Parallel Old 收集器-标记整理算法
  
  Parallel Old 是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法。这个收集器在1.6中才开始提供。
  
  3.CMS收集器-标记整理算法
  
  CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。
  
  目前很大一部分的Java应用集中在互联网站或者B/S系统的服务端上,这类应用尤其重视服务器的响应速度,希望系统停顿时间最短,以给用户带来较好的体验。CMS收集器就非常符合这类应用的需求。
  
  CMS收集器是基于“标记-清除”算法实现的,它的运作过程相对前面几种收集器来说更复杂一些,整个过程分为4个步骤:
  
  (1)初始标记;
  
  (2)并发标记;
  
  (3)重新标记;
  
  (4)并发清除。
  
  其中,初始标记、重新标记这两个步骤仍然需要“Stop The World”
  
  CMS收集器主要优点:
  
  并发收集;
  
  低停顿。
  
  CMS三个明显的缺点:
  
  (2)CMS收集器无法处理浮动垃圾,可能出现“Concurrent Mode Failure”失败而导致另一次Full GC的产生。在JDK1.5的默认设置下,CMS收集器当老年代使用了68%的空间后就会被激活;
  
  (2)CMS收集器无法处理浮动垃圾,可能出现“Concurrent Mode Failure”失败而导致另一次Full GC的产生。在JDK1.5的默认设置下,CMS收集器当老年代使用了68%的空间后就会被激活。
  
  (3)CMS是基于“标记-清除”算法实现的收集器,手机结束时会有大量空间碎片产生。空间碎片过多,可能会出现老年代还有很大空间剩余,但是无法找到足够大的连续空间来分配当前对象,不得不提前出发FullGC。
  
  新生代和老年代垃圾收集器
  
  1.G1收集器-标记整理算法
  
  JDK1.7后全新的回收器, 用于取代CMS收集器。
  
  G1收集器的优势:
  
  独特的分代垃圾回收器,分代GC: 分代收集器, 同时兼顾年轻代和老年代;
  
  使用分区算法, 不要求eden, 年轻代或老年代的空间都连续;
  
  并行性: 回收期间, 可由多个线程同时工作, 有效利用多核cpu资源;
  
  空间整理: 回收过程中, 会进行适当对象移动, 减少空间碎片;
  
  可预见性: G1可选取部分区域进行回收, 可以缩小回收范围, 减少全局停顿。
  
  G1收集器的运作大致可划分为一下步骤:
  
  G1收集器的阶段分以下几个步骤:
  
  1、初始标记(它标记了从GC Root开始直接可达的对象);
  
  2、并发标记(从GC Roots开始对堆中对象进行可达性分析,找出存活对象);
  
  3、最终标记(标记那些在并发标记阶段发生变化的对象,将被回收);
  
  4、筛选回收(首先对各个Regin的回收价值和成本进行排序,根据用户所期待的GC停顿时间指定回收计划,回收一部分Region)。
  
  二、JVM垃圾收集器总结
  
  本文主要介绍了JVM中的垃圾回收器,主要包括串行回收器、并行回收器以及CMS回收器、G1回收器。他们各自都有优缺点,通常来说你需要根据你的业务,进行基于垃圾回收器的性能测试,然后再做选择。下面给出配置回收器时,经常使用的参数:
  
  -XX:+UseSerialGC:在新生代和老年代使用串行收集器
  
  -XX:+UseParNewGC:在新生代使用并行收集器
  
  -XX:+UseParallelGC :新生代使用并行回收收集器,更加关注吞吐量
  
  -XX:+UseParallelOldGC:老年代使用并行回收收集器
  
  -XX:ParallelGCThreads:设置用于垃圾回收的线程数
  
  -XX:+UseConcMarkSweepGC:新生代使用并行收集器,老年代使用CMS+串行收集器
  
  -XX:ParallelCMSThreads:设定CMS的线程数量
  
  -XX:+UseG1GC:启用G1垃圾回收器
  
  觉得不错请点赞支持下。
  
  ---end---
  
  往期热文:
  
  高并发架构系列:如何从0到1设计一个MQ消息队列
  
  高并发架构系列:Redis缓存和MySQL数据一致性方案详解
  
  【精选】278道高级Java高频面试题目+答案,通关中大型互联网企业高级工程师必备
  
  2019-03-12 20:21:58,181 INFO hive.HiveImport: Time taken: 1.619 seconds
  
  2019-03-12 20:21:58,681 INFO hive.HiveImport: Hive import complete.
  
    接下来我们将 MySql 中的表 hive2mysql_mshk 数据,导入到 Hbase ,同时在 Hbase 中创建表 mysql2hase_mshk
  
  [root@c0 ~]# sqoop import --connect jdbc:mysql://www.jrgjze.com c0:3306/testmshk?useSSL=false --username root --password 123456 --split-by id --table hive2mysql_mshk --hbase-table mysql2hase_mshk -www.yongshi123.cn-hbase-create-table --hbase-row-key id --column-family id
  
  2019-03-13 12:04:33,647 INFO sqoop.Sqoop: Running Sqoop version: 1.4.7
  
  2019-03-13 12:04:33,694 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead.
  
  2019-03-13 12:04:33,841 INFO manager.MySQLManager: Preparing to use www.meiwanyule.cn/ MySQL streaming resultset.
  
  2019-03-13 12:04:33,841 INFO tool.CodeGenTool:www.dfgjpt.com Beginning www.jrgjze.com/ code generation
  
  2019-03-13 12:04:34,162 INFO manager.SqlManager: www.gen-okamoto.com Executing SQL statement: SELECT t.* FROM `hive2mysql_mshk` AS t LIMIT 1
  
  2019-03-13 12:04:34,197 INFO manager.www.xianjingshuiqi.com SqlManager: Executing SQL statement: SELECT t.* FROM `hive2mysql_mshk` AS t LIMIT 1
  
  hbase(main):004:0>
  
    如何在 Hbase 和 Hive 中互相导入、导出数据,请参考文章:Hadoop 3.1.2(HA)+Zookeeper3.4.13+Hbase1.4.9(HA)+Hive2.3.4+Spark2.4.0(HA)高可用集群搭建 中的 9.2.4 和 9.2.5 章节。

7种JVM垃圾收集器特点,优劣势、及使用场景的更多相关文章

  1. 7种 JVM 垃圾收集器特点、优劣势及使用场景(多图)

    7种 JVM 垃圾收集器特点.优劣势及使用场景(多图)  mp.weixin.qq.com 点击上方"IT牧场",选择"设为星标"技术干货每日送达! 一.常见垃 ...

  2. 5种JVM垃圾收集器特点和8种JVM内存溢出原因

    先来看看5种JVM垃圾收集器特点 一.常见垃圾收集器 现在常见的垃圾收集器有如下几种: 新生代收集器: Serial ParNew Parallel Scavenge 老年代收集器: Serial O ...

  3. JVM调优:HotSpot JVM垃圾收集器

    HotSpot JVM垃圾收集器 - Snooper - 博客园https://www.cnblogs.com/snooper/p/8718478.html

  4. 第五章 JVM垃圾收集器(1)

    说明:垃圾回收算法是理论,垃圾收集器是回收算法的实现,关于回收算法,见<第四章 JVM垃圾回收算法> 1.七种垃圾收集器 Serial(串行GC)-- 复制 ParNew(并行GC)-- ...

  5. JVM垃圾收集器(1)

    此文已由作者赵计刚薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 说明:垃圾回收算法是理论,垃圾收集器是回收算法的实现,关于回收算法,见<第四章 JVM垃圾回收算法& ...

  6. 【006】【JVM——垃圾收集器总结】

     Java虚拟机学习总结文件夹 JVM--垃圾收集器总结 垃圾收集器概览 收集算法是内存回收的方法论.垃圾收集据是内存回收的详细实现.Java虚拟机规范中对垃圾收集器应该怎样实现没有规定.不同的厂 ...

  7. 第六章 JVM垃圾收集器(2)

    上一章记录了几种常见的垃圾收集器,见<第五章 JVM垃圾收集器(1)> 1.G1 说明: 从上图来看,G1与CMS相比,仅在最后的"筛选回收"部分不同(CMS是并发清除 ...

  8. JVM垃圾收集器-Parallel Scavenge收集器

    今天我给大家讲讲JVM垃圾收集器-Parallel Scavenge收集器 Parallel Scavenge收集器 Parallel Scavenge收集器也是一个新生代收集器,它也是使用复制算法的 ...

  9. 面试官:说一下JVM常用垃圾回收器的特点、优劣势、使用场景和参数设置

    今天去看牙医,他问我年级轻轻牙齿怎么磨损这么严重?我说,没有人点赞的这些年,我都是咬着牙过来的. Java中的垃圾回收器几乎是面试中的必考点,无论是面试初级,中级还是高级,总免不了要问一问垃圾回收器的 ...

随机推荐

  1. LiveCharts文档-4基本绘图-3其他

    原文:LiveCharts文档-4基本绘图-3其他 4基本绘图-3其他 因为每个图表的使用方法大同小异,所以不再啰嗦重复,具体直接看这个链接里的介绍.原文链接 其他的图表类型有 基本堆叠图 基本条形图 ...

  2. [Partition][Index]对于Partition表而言,是否Global Index 和 Local Index 可以针对同一个字段建立?

    对于Partition表而言,是否Global Index 和 Local Index 可以针对同一个字段建立? 实验证明,对单独的列而言,要么建立 Global Index, 要么建立 Local ...

  3. Mybatis 中 columnPrefix别名的用法

    1.映射对应的属性,区分他们分别属于哪些类.(sql书写的时候为什么要将前缀加上(别名),是因为便于它去寻找哪个类的前缀是ANNEX_) 2.例:  如下所示当一个collection 定义了一个co ...

  4. Redis+TwemProxy(nutcracker)集群方案部署记录

    Twemproxy 又称nutcracker ,是一个memcache.Redis协议的轻量级代理,一个用于sharding 的中间件.有了Twemproxy,客户端不直接访问Redis服务器,而是通 ...

  5. poj1426 Find The Multiple(c语言巧解)

    Find The Multiple Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 36335   Accepted: 151 ...

  6. 毕业设计 之 二 PHP集成环境(Dreamweaver)使用

    毕业设计 之 二 PHP学习笔记(一) 作者:20135216 平台:windows10 软件:XAMPP,DreamWeaver 一.环境搭建 1.XAMPP下载安装 XAMPP是PHP.MySQL ...

  7. 读书笔记(chapter3)

    进程管理 3.1进程 1.进程:进程就是处于执行期的程序,实际上,进程就是正在执行的程序代码的实时结果: 2.执行线程,简称线程,是进程中活动的对象(每个线程拥有独立的程序计数器.进程栈.和一组进程寄 ...

  8. C程序设计实践教学提示

    实践教学要点:实验重心应放在实验室之外,重在实验准备 对实验题目的分析是一个复杂的工作,很发时间的,如全部放在实验上机时来完成,是不现实的.(特别是后面实验的难度增大,或实验代码增多的情况下),而且, ...

  9. python 中的三元表达式及lambda

    一.三元表达式 举一个简单的列子,很多地方都有这样的规定,比如用水或者用电,假设用水价格为3R/立方米,当你每个月用超过7立方米后,超出的水按照3.3R/立方米计价.然后写一个程序计算一个家庭每月的水 ...

  10. 【转】七牛免费SSL证书,配置自定义域名CDN加速

    原文链接:https://excaliburhan.com/post/use-qiniu-ssl-and-cdn.html 申请七牛SSL证书 其实,七牛在很早之前就支持CDN使用https,但是他要 ...