4. GC日志分析

4.1 日志分析

  1. 通过阅读GC日志,我们可以了解Java虚拟机内存分配与回收策略。
  1. 内存分配与垃圾回收的参数列表-XX:+PrintGC:输出GC日志。类似-verbose: gc

  1. -XX: +PrintGCDetails输出GC的详细日志

  1. -XX:+ PrintGCTimeStamps输出GC的时间戳(以基准时间的形式)
  2. -XX:+ PrintGCDateStamps输出GC的时间戳(以日期的形式,如2013-0504m21:53:59.234+0800)

  1. -XX: +PrintHeapAtGC:在进行GC的前后打印出堆的信息
  1. -Xloggc:./logs/ge.log日志文件的输出路径

4.2 日志补充说明

  1. "[GC"和"[FullGC"说明了这次垃圾收集的停顿类型,如果有"Full"则说明GC发生了"stop-the-World";
  1. 使用Serial收集器在新生代的名字是 Default New Generation,因此显示的是"[De fnew;
  1. 使用 Parnew收集器在新生代的名字会变成"[ParNew",意思是"Parallel New Generation
  1. 使用Parallel Scavenge收集器在新生代的名字是"[Psyounggen;
  1. 老年代的收集和新生代道理一样,名字也是收集器决定的;
  1. 使用G1收集器的话,会显示为"garbage- first heap"
  1. Allocation Failure
    • 表明本次引起GC的原因是因为在年轻代中没有足够的空间能够存储新的数据了。
  1. Psyounggen:5986K->696K(8704K)J5986K->704K(9216K)
    • 中括号内:GC回收前年轻代大小,回收后大小,(年轻代总大小)
    • 括号外:GC回收前年轻代和老年代大小,回收后大小,(年轻代和老年代总大小)
  1. user代表用户态回收耗时,sys内核态回收耗时,real实际耗时。由于多核的原因,时间总和可能会超过real时间

4.3 堆空间日志数据解读

4.4 日志分析工具

  1. 如果想把GC日志存到文件的话,是下面这个参数:

  1. 可以用一些工具去分析这些gc日志:

| 常用的工具有:GCViewer、 GCEasy、 GCHisto、 GCLogViewer、Hpjmeter、 garbagecat等。

5. 垃圾回收器的新发展

5.1 概述

  1. GC仍然处于飞速发展之中,目前的默认选项G1 GC在不断的进行改进,很多我们原来认为的缺点,例如串行的Full GC、 Card Table扫描的低效等,都已经被大幅改进,例如,JDK10以后,Full GC已经是并行运行,在很多场景下,其表现还略优于Parallel GC的并行Full GC实现。
  1. 即使是Serial GC,虽然比较古老,但是简单的设计和实现未必就是过时的,它本身的开销,不管是GC相关数据结构的开销,还是线程的开销,都是非常小的,所以随着云计算的兴起,在Serverless等新的应用场景下, Serial GC找到了新的舞台。
  1. 比较不幸的是CMS GC,因为其算法的理论缺陷等原因,虽然现在还有非常大的用户群体,但在JDK9中已经被标记为废弃,并在JDK14版本中移除

5.2 Shenandoah GC

  1. 我们还看到了引入了两个新的收集器:ZGC(JDK11出现)和Shenandoah(Open JDK12)。主打特点:低停顿时间
  1. Open JDK12的Shenandoah GC:低停顿时间的GC(实验性)
  1. Shenandoah,无疑是众多GC中最孤独的一个。是第一款不由Oracle公司团队领导开发的Hotspot垃圾收集器。不可避免的受到官方的排挤。比如号称OpenJDK和OracleJDK:没有区别的 Oracle公司仍拒绝在OracleJDK12中支持 Shenandoah
  1. Shenandoah垃圾回收器最初由RedHat进行的一项垃圾收集器研究项目Pauseless GC的实现,旨在针对JVM上的内存回收实现低停顿的需求。在2014年贡献给OpenJDK
  1. Red Hat研发Shenandoah团队对外宣称, Shenandoah垃圾回收器的暂停时间与堆大小无关,这意味着无论将堆设置为260MB还是2606B,99.9%的目标都可以把垃圾收集的停顿时间限制在十毫秒以内。不过实际使用性能将取决于实际工作堆的大小和工作负载。
  1. 这是Redhat七在2016年发表的论文数据,测试内容是使用E8对200GB的维基百科数据进行索引。从结果看:
    • 停顿时间比其他几款收集器确实有了质的飞跃,但也未实现最大停顿时间控制在十毫秒以内的目标。
    • 而吞吐量方面出现了明显的下降,总运行时间是所有测试收集器里最长的。

  1. 总结:
    • Shenandoah GC的弱项:高运行负担下的吞吐量下降
    • Shenandoah GC的强项:低延迟时间。
    • Shenandoah GC的工作过程大致分为九个阶段,这里就不再赘述。在之前Java12新特性视频里有过介绍。

5.3 ZGC

  1. ZGC与Shenandoah目标高度相似,在尽可能对存吐量影响不大的前提下,实现在任意堆内存大小下部可以把垃圾收集的停顿时间限制在十毫秒以内的低延迟。
  1. 《深入理解Java虚拟机》一书中这样定义ZGC:ZGC收集器是一款基于Region内存布局的,(暂时)不设分代的,使用了读屏障、染色指针和内存多重映射等技术来实现可并发的标记-压缩算法的,以低延迟为首要目标的一款垃圾收集器。
  1. ZGC的工作过程可以分为4个阶段:并发标记-并发预备重分配-并发重分配并发重映射等。
  1. ZGC几乎在所有地方并发执行的,除了初始标记的是STW的。所以停顿时间几乎就耗费在初始标记上,这部分的实际时间是非常少的
  1. 在ZGC的强项停顿时间测试上,它亳不留情的将Parallel、G1拉开了两个数量级的差距。无论平均停顿、95%停顿、99%停顿、99.9%停顿,还是最大停顿时间,ZGC都能毫不费劲控制在10毫秒以内。
  1. 测试数据

  1. JDK14的新特性
    • ZGC应用在macos上
    • ZGC应用在Windows上
    • JDK14之前,ZGC仅Linux才支持。
    • 尽管许多使用ZGC的用户都使用类エinux的环境,但在 Windows和 macos上,人们也需要ZGC进行开发部署和测试。许多桌面应用也可以从ZGC中受益。因此,ZGC特性被移植到了Windows和macos上。
    • 现在mac或Windows上也能使用ZGC了,示例如下:

5.4 Ali GC

  1. AliGC是阿里巴巴JVM团队基于G1算法开发,面向大堆应用场景,指定场景下的对比:

 

 

15岁觉得游泳难,放弃游泳,到18岁遇到一个你喜欢的人约你去游泳,你只好说“我不会耶”。18岁觉得英文难,放弃英文,28岁出现一个很棒但要会英文的工作,你只好说“我不会耶”。人生前期越嫌麻烦,越懒得学,后来就越可能错过让你动心的人和事,错过新风景。

感谢尚硅谷,感谢宋红康老师,感谢赶路的自己

JVM 专题二十二:垃圾回收(六)垃圾回收器 (三)的更多相关文章

  1. 「kuangbin带你飞」专题二十二 区间DP

    layout: post title: 「kuangbin带你飞」专题二十二 区间DP author: "luowentaoaa" catalog: true tags: - ku ...

  2. 专题开发十二:JEECG微云高速开发平台-基础用户权限

      专题开发十二:JEECG微云高速开发平台-基础用户权限 11.3.4自己定义button权限 Jeecg中.眼下button权限设置,是通过对平台自己封装的button标签(<t:dgFun ...

  3. JAVA基础知识总结:一到二十二全部总结

    >一: 一.软件开发的常识 1.什么是软件? 一系列按照特定顺序组织起来的计算机数据或者指令 常见的软件: 系统软件:Windows\Mac OS \Linux 应用软件:QQ,一系列的播放器( ...

  4. [分享] IT天空的二十二条军规

    Una 发表于 2014-9-19 20:25:06 https://www.itsk.com/thread-335975-1-1.html IT天空的二十二条军规 第一条.你不是什么都会,也不是什么 ...

  5. Bootstrap <基础二十二>超大屏幕(Jumbotron)

    Bootstrap 支持的另一个特性,超大屏幕(Jumbotron).顾名思义该组件可以增加标题的大小,并为登陆页面内容添加更多的外边距(margin).使用超大屏幕(Jumbotron)的步骤如下: ...

  6. Web 前端开发精华文章推荐(HTML5、CSS3、jQuery)【系列二十二】

    <Web 前端开发精华文章推荐>2014年第一期(总第二十二期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML ...

  7. VMware vSphere 服务器虚拟化之二十二桌面虚拟化之创建View Composer链接克隆的虚拟桌面池

    VMware vSphere 服务器虚拟化之二十二桌面虚拟化之创建View Composer链接克隆的虚拟桌面池 在上一节我们创建了完整克隆的自动专有桌面池,在创建过程比较缓慢,这次我们将学习创建Vi ...

  8. JAVA之旅(二十二)——Map概述,子类对象特点,共性方法,keySet,entrySet,Map小练习

    JAVA之旅(二十二)--Map概述,子类对象特点,共性方法,keySet,entrySet,Map小练习 继续坚持下去吧,各位骚年们! 事实上,我们的数据结构,只剩下这个Map的知识点了,平时开发中 ...

  9. 智课雅思词汇---二十二、-al即是名词性后缀又是形容词后缀

    智课雅思词汇---二十二.-al即是名词性后缀又是形容词后缀 一.总结 一句话总结: 后缀:-al ②[名词后缀] 1.构成抽象名词,表示行为.状况.事情 refusal 拒绝 proposal 提议 ...

  10. FreeSql (二十二)Dto 映射查询

    适合喜欢使用 dto 的朋友,很多时候 entity 与 dto 属性名相同,属性数据又不完全一致. 有的人先查回所有字段数据,再使用 AutoMapper 映射. 我们的功能是先映射,再只查询映射好 ...

随机推荐

  1. 58同城Java面试

    总结这一次面试失败的不冤 很多知识,都是了解.知道,而没有做到明白与彻底的弄懂 差距还是比较大的 以后要多来写总结,提升自己,争取早日被认可 说说今天面试的主要内容和问题吧 希望大家集思广益 面试职位 ...

  2. 测试-spring源码摘取

    首次加载idea是真的慢... 也许是我电脑性能太差... 我分析他内部有一套索引的机制,需要每次打开现建立... 没有固态的话,首次打开还不如eclipse 第一次使用博客园,以前都在csdn混~ ...

  3. git环境配置 | GitHub

    注册完GitHub之后,需要配置git,其主要的目的是为了方便文件的上传.下载等. 一. git下载 https://git-scm.com/downloads 在git官网找到相应版本的git下载安 ...

  4. 02、MyBatis XML配置

    MyBatis-全局配置文件 在MyBatis中全局配置文件有着重要的地位,里面有9类行为信息;如果我们要想将MyBatis运用的熟练,配置全局配置文件是必不可少的步骤,所以我们一定要啃下这一块硬骨头 ...

  5. String Problem(模板)【最短路】

    String Problem 题目链接(点击) Boy Valera likes strings. And even more he likes them, when they are identic ...

  6. PuTTY通过SSH连接上Ubuntu20.04

    在PuTTY中连接到Ubuntu20.04大致需要几个步骤(不一定对应文本中的序号):1) 安装opensh-server (Ubuntu安装好之后 ,一般openssh-client自动已经安装好) ...

  7. 一文读懂Redis的四种模式,单机、主从、哨兵、集群

    少点代码,多点头发 本文已经被GitHub收录,欢迎大家踊跃star 和 issues. https://github.com/midou-tech/articles 入职第一周,我被坑了 最近刚入职 ...

  8. numpy中的浅复制和深复制

    浅复制:主要有两种方式,简单的赋值或者使用视图(view) 简单的赋值:其实就是制造了一个别名,数组并没有被copy成新的一份,当使用其中一个别名改变数组值的时候,另一个别名对应的值一并改变. > ...

  9. GitHub如何回滚代码?

    1.git log 查看commit hash值 执行git log:查看commit hash值. 2.执行git reset --hard xxxx xxxx表示的是commit hash 值. ...

  10. 最通俗易懂的RSA加密解密指导

    前言 RSA加密算法是一种非对称加密算法,简单来说,就是加密时使用一个钥匙,解密时使用另一个钥匙. 因为加密的钥匙是公开的,所又称公钥,解密的钥匙是不公开的,所以称为私钥. 密钥 关于RSA加密有很多 ...