4个Java垃圾收集器–错误的选择如何严重影响性能

在2014年,对于大多数开发人员来说,还有两件事仍然是个谜:垃圾收集和了解异性。 由于我对后者知之甚少,所以我认为我会对前者大吃一惊,特别是因为在该领域中,Java 8发生了一些重大变化和改进,尤其是去除了PermGen和一些新的令人兴奋的优化(有关此方面的更多信息,请参见结尾)。

当我们谈论垃圾收集时,我们中的绝大多数人都知道这个概念并将其应用于我们的日常编程中。 即使这样,很多事情我们还是不了解,那时候情况就变得很痛苦。 关于JVM的最大误解之一是它有一个垃圾收集器,实际上它提供了四种不同的垃圾收集器,每种垃圾都有其独特的优缺点。 使用哪种选择不是自动的,而是由您自己决定的,并且吞吐量和应用程序暂停之间的差异会很大。

这四种垃圾收集算法的共同点是它们是代生成的,这意味着它们使用古老的假设(即堆中的大多数对象是短寿命的,应Swift回收)将托管堆分成不同的段。 由于这也是一个覆盖面广的领域,因此,我将直接介绍不同的算法,以及它们的优缺点。

1.串行收集器

串行收集器是最简单的一种,您可能不会使用,因为它主要是为单线程环境(例如32位或Windows)和小型堆而设计的。 该收集器会在其工作时冻结所有应用程序线程,这使它无法出于所有意图和目的在服务器环境中使用。

使用方法:您可以通过打开-XX:+ UseSerialGC JVM参数来使用它,

2.并行/吞吐量收集器

接下来是并行收集器。 这是JVM的默认收集器。 就像它的名字一样,它的最大优点是使用多个线程来扫描并压缩堆。 并行收集器的不利之处在于,在执行次要或完全GC收集时,它将停止应用程序线程。 并行收集器最适合可以容忍应用程序暂停并试图优化以减少由收集器引起的CPU开销的应用程序。

3. CMS收集器

紧跟在并行收集器之后的是CMS收集器(“ current-mark-sweep ”)。 该算法使用多个线程(“并发”)在堆(“标记”)中进行扫描以查找可以回收(“清扫”)的未使用对象。 在两种情况下,该算法将进入“世界停止”(STW)模式:初始化根的初始标记(从线程入口点或静态变量可以访问的旧代对象),并且应用程序更改了状态在算法同时运行时将其堆放,迫使其返回并进行最后的修改以确保标记了正确的对象。

使用此收集器时,最大的问题是遇到升级失败 ,这是在收集年轻一代和老一代之间出现种族状况的情况。 如果收集器需要将年轻物体提升给老一代,但又没有足够的时间清理空间,则必须首先这样做,这将导致完整的STW收集-这就是CMS收集器的初衷阻止。 为确保不会发生这种情况,您可以增加旧一代的大小(或为此增加整个堆的大小),或者为收集器分配更多的后台线程,以供他与对象分配率竞争。

与并行收集器相比,此算法的另一个缺点是,它使用更多的CPU,以便通过使用多个线程来执行扫描和收集,从而为应用程序提供更高级别的连续吞吐量。 对于大多数长时间运行的服务器应用程序而言,这不利于应用程序冻结,这通常是一个不错的选择。 即使这样, 默认情况下不会启用该算法。 您必须指定XX:+ USeParNewGC才能真正启用它。 如果您愿意分配更多的CPU资源以避免应用程序暂停,那么这可能是您可能要使用的收集器,假设您的堆大小小于4Gb。 但是,如果大于4GB,则可能要使用最后一种算法-G1收集器。

4. G1收藏家

JDK 7更新4中引入的Garbage first收集器(G1)旨在更好地支持大于4GB的堆。 G1收集器利用多个后台线程来扫描它划分为多个区域的堆,范围从1MB到32MB(取决于堆的大小)。 G1收集器旨在首先扫描那些包含最多垃圾对象的区域,并为其命名(垃圾优先)。 使用–XX:+ UseG1GC标志打开此收集器。

这种策略有可能在后台线程完成扫描未使用的对象之前耗尽堆,在这种情况下,收集器将不得不停止应用程序,这将导致STW收集。 G1还具有另一个优势,即它可以在移动过程中压缩堆,这是CMS收集器仅在完整STW收集期间执行的操作。

在过去的几年中,大堆一直是一个有争议的领域,许多开发人员从每台机器模型的单个JVM转移到每台机器具有多个JVM的更多微服务,组件化架构。 这是由许多因素驱动的,包括希望隔离不同的应用程序部分,简化部署并避免通常将应用程序类重新加载到内存中所带来的成本(在Java 8中已得到某些改进)。

即使这样,涉及JVM的最大驱动程序之一还是希望避免大堆发生的长时间“停止世界”暂停(在大型集合中可能要花费几秒钟)。 Docker之类的容器技术也加快了这一步,使您能够相对轻松地在同一台物理计算机上部署多个应用程序。

Java 8和G1收集器

Java 8 update 20刚刚推出的另一个漂亮的优化是G1收集器字符串重复数据删除 。 由于字符串(及其内部char []数组)占用了我们的大部分堆空间,因此进行了新的优化,使G1收集器可以识别在整个堆中重复多次的字符串,并更正它们以指向同一内部字符[]数组,以避免同一字符串的多个副本无效地驻留在堆中。 您可以使用-XX:+ UseStringDeduplication JVM参数来进行尝试。

Java 8和PermGen

Java 8中最大的更改之一是删除了堆中的permgen部分,该部分通常分配给类元数据,内部字符串和静态变量。 传统上,这要求开发人员使用的应用程序会加载大量的类(对于使用企业容器的应用程序很常见),以专门针对堆的这一部分进行优化和调整。 多年来,这已成为许多OutOfMemory异常的来源,因此(如果是非常不错的)添加JVM(主要是)要多加注意。 即使这样,它本身也可能不会减少开发人员将其应用程序分离到多个JVM中的浪潮。

这些收集器中的每一个都通过一系列的拨动开关进行不同的配置和调整,每一个都有增加或减少吞吐量的潜力,所有这些都取决于应用程序的特定行为。 在下一篇文章中,我们将探讨配置这些策略的关键策略。

同时,您最想了解关于不同收藏家之间差异的哪些事情? 在评论部分打我!

补充阅读

  1. 在InfoQ上对G1收集器进行了非常深入的深入审查。
  2. Java性能–权威指南。 我最喜欢的Java性能书 。
  3. 在CodeCentric 博客上可以找到有关字符串重复数据删除的更多信息。

翻译自: https://www.javacodegeeks.com/2014/09/garbage-collectors-serial-vs-parallel-vs-cms-vs-g1-and-whats-new-in-java-8.html

垃圾收集器–串行,并行,CMS,G1(以及Java 8中的新增功能)相关推荐

  1. JVM学习(十四):垃圾收集器(万字介绍CMS、G1)

    目录 一.垃圾收集器们 二.CMS(Concurrent-Mark-Sweep):低延迟 2.1 什么是CMS 2.2 CMS工作流程 2.3 详细描述 2.4 CMS的优缺点 2.4.1 优点 2. ...

  2. 串行并行程序在效率上的简单比较

    串行&并行程序在效率上的简单比较 分类: Multi-X 2010-10-15 10:33 1198人阅读 评论(0) 收藏 举报 parallel工作程序开发作业语言测试 开头:     这 ...

  3. 基于串行并行ADMM算法的主从配电网分布式优化控制研究

    基于串行并行ADMM算法的主从配电网分布式优化控制研究 关键词:ADMM 串行并行算法 主动配电网 无功优化 分布式优化 参考文档:非复现,仅参考部分模型: 1)<主动配电网分布式无功优化控制方 ...

  4. 【转载】串行并行工序混合的生产线数学模型

    串行并行工序混合的生产线数学模型 串行并行工序混合的生产线数学模型 生产线简介 示意图 目标函数 求解结果 生产线简介 很多生产线工序并不是简单的串行或并行关系,而实两种同时存在的混合并发关系,本文主 ...

  5. 【51单片机】串行口连接74LS164进行串行/并行转换,输出到一个七段数码管。数码管循环显示0-9。采用串行通信方式0,定时间隔1秒。

    实验内容:51单片机的串行口连接74LS164进行串行/并行转换,然后输出到一个七段数码管.数码管循环显示0-9这10个数字.要求采用串行通信方式0,定时间隔1秒. 工具:proteus+keil # ...

  6. 串行并行 同步异步通信

    终端与其他设备(例如其他终端.计算机和外部设备)通过数据传输进行通信.数据传输可以通过两种方式进行:并行通信和串行通信. 1.串行通信 是指使用一条数据线,将数据一位一位地依次传输,每一位数据占据一个 ...

  7. CRC校验 串行 并行 长除 移位 查表 矩阵

    CRC校验的几种类型: 长除法,也叫直接计算法 移位寄存器,也叫线性移位 查表法 并行算法 一些有用的网页: CRC并行推导 https://blog.csdn.net/Old_Street/arti ...

  8. 计算机网络之物理层:1、接口特性、同步异步、串行并行、双工

    物理层:1.物理层相关概念 思维导图:(学习任务) 接口特性: 数据通信基础: 设计数据通信系统要考虑的三个问题: 三种通信方式: 串行.并行传输: 同步.异步传输: 思维导图:(学习任务) 接口特性 ...

  9. L9825_用于电阻和电感负载的八通道低侧驱动器,具有串行/并行输入控制、输出保护和诊断

    描述 L9825是一种八进制低压侧驱动电路,专用于汽车应用.当感应负载被驱动时,输出电压箝位用于反激电流再循环.芯片选择和串行外围接口,用于输出控制和诊断数据传输.两个输出的并联控制输入. 所有功能 ...

最新文章

  1. 自己动手设计RESTful API
  2. Linux之chattr命令详解
  3. cad服务器手动改自动,几百块就能手动改自动? 怎样省钱换来方便
  4. 密码学专题 信息摘要和数字签名指令
  5. 20.校准相机——介绍,使用已知点进行校正,直接线性校准均匀性第1部分,直接线性校准均匀性第2部分_1
  6. 002.操作系统的选择
  7. java 串口 rxtx_【Java】基于RXTX的Java串口通信
  8. java httppost raw_httpclient raw请求
  9. {0}占位替换指定位置数据
  10. 全网首发:org.xml.sax.SAXNotRecognizedException: unrecognized features nonvalidating/load-external-dtd
  11. 三菱FX PLC编程口通讯协议详解
  12. GOM引擎 mirserver服务端各文件夹注解
  13. 决策树CART 代价复杂度剪枝
  14. python反爬中url之aes加密_python反爬之前端加密技术
  15. android 路由器 操作系统,小米全新路由器操作系统是什么?支持什么语言?
  16. 银行资产业务和负债业务
  17. rtmp/rtsp播放器
  18. 简单的网页设计,以学校官网为例
  19. 微信小程序云开发入门教程
  20. 企业引导页自适应HTML源码

热门文章

  1. 网站压力测试软件(Apache JMeter)2.13 官方版 Error: Unable to access jarfile ApacheJMeter.jar
  2. 为什么哲学是最难的学科_什么是哲学哲学对大师来说可能非常理论化,没有一定哲学基础肯能很难 爱问知识人...
  3. jvm MinorGC和查看GC日志
  4. 匿名内部类与Lambda表达式
  5. java 读取 文本块_Java文本块
  6. 化学专业尽早转行_尽早查看针对Java 11的功能
  7. stringbuffer_StringBuffer的存在的含义
  8. apache.camel_Apache Camel 2.18发布–包含内容
  9. dynamodb容器使用_使用DynamoDBMapper插入DynamoDB项目
  10. spark有什么作用_Spark 101:它是什么,它做什么以及为什么起作用