喜欢文章的可以关注下公众号!谢谢支持!!

之前两篇文章已经分析了对象是如何进入老年代的,接着我们在这篇文章中演示一下,老年代的GC是如何触发的。

示例代码

GC日志

-XX:NewSize=10485760 -XX:MaxNewSize=10485760 -XX:InitialHeapSize=20971520 -XX:MaxHeapSize=20971520 -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=15 -XX:PretenureSizeThreshold=3145728 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:gc.log

这里最关键一个参数,就是“-XX:PretenureSizeThreshold=3145728”
这个参数要设置大对象阈值为3MB,也就是超过3MB,就直接进入老年代。
运行之后会得到如下GC日志:

“0.308: [GC (Allocation Failure) 0.308: [ParNew (promotion failed): 7260K->7970K(9216K), 0.0048975 secs]0.314: [CMS:8194K->6836K(10240K), 0.0049920 secs] 11356K->6836K(19456K), [Metaspace: 2776K->2776K(1056768K)], 0.0106074 secs][Times: user=0.00 sys=0.00, real=0.01 secs]Heappar new generation total 9216K, used 2130K [0x00000000fec00000, 0x00000000ff600000, 0x00000000ff600000) eden space 8192K, 26% used [0x00000000fec00000, 0x00000000fee14930, 0x00000000ff400000) from space 1024K, 0% used [0x00000000ff500000, 0x00000000ff500000, 0x00000000ff600000) to space 1024K, 0% used [0x00000000ff400000, 0x00000000ff400000, 0x00000000ff500000)concurrent mark-sweep generation total 10240K, used 6836K [0x00000000ff600000, 0x0000000100000000,0x0000000100000000)Metaspace used 2782K, capacity 4486K, committed 4864K, reserved 1056768K class space used 300K, capacity 386K, committed 512K, reserved 1048576K”

一步步分析日志

首先我们看如下代码:

这行代码直接分配了一个4MB的大对象,此时这个对象会直接进入老年代,接着array1不再引用这个对象。此时如下图所示:

接着看看下面的代码:

连续分配了四个数组,其中三个是2MB的数组,1个是128KB的数组,如下图所示,全部会进入Eden区域中:

接着会执行如下代码:byte[] array6 = new byte[2 * 1024 * 1024];。此时还能放得下2MB的对象吗?不可能了,因为Eden区已经放不下了。因此此时会直接触发一次Young GC。

我们看下面的GC日志:

ParNew (promotion failed): 7260K->7970K(9216K), 0.0048975 secs

这行日志显示了,Eden区原来是有7000多KB的对象,但是回收之后发现一个都回收不掉,因为上述几个数组都被变量引用了。所以此时应该都知道,一定会直接把这些对象放入到老年代里去,但是此时老年代里已经有一个4MB的数组了,还能放的下3个2MB的数组和1个128KB的数组吗?明显是不行的,此时一定会超过老年代的10MB大小。所以此时我们看gc日志:

[CMS: 8194K->6836K(10240K), 0.0049920 secs] 11356K->6836K(19456K), [Metaspace: 2776K->2776K(1056768K)],0.0106074 secs]

可以清晰看到,此时执行了CMS垃圾回收器的Full GC,我们之前讲过Full GC其实就是会对老年代进行Old GC,同时一般会跟一次Young GC关联,还会触发一次元数据区(永久代)的GC。

在CMS Full GC之前,就已经触发过Young GC了,此时大家可以看到此时Young GC就已经有了,接着就是执行针对老年代的Old GC,也就是如下日志:

CMS: 8194K->6836K(10240K), 0.0049920 secs

这里看到老年代从8MB左右的对象占用,变成了6MB左右的对象占用,这是怎么个过程呢?很简单,一定是在Young GC之后,先把2个2MB的数组放入了老年代,如下图:

此时要继续放1个2MB的数组和1个128KB的数组到老年代,一定会放不下,所以此时就会触发CMS的Full GC。然后此时就会回收掉其中的一个4MB的数组,因为他已经没人引用了,如下图所示:

接着放入进去1个2MB的数组和一个128KB数组,如下图所示:

所以再看CMS的垃圾回收日志:

CMS: 8194K->6836K(10240K), 0.0049920 secs

他是从回收前的8MB变成了6MB,就是上图所示。最后在CMS Full GC执行完毕之后,其实年轻代的对象都进入了老年代,此时最后一行代码要在年轻代分配2MB的数组就可以成功了,如下图:

本文给大家讲解了一个触发老年代GC的案例,就是年轻代存活的对象太多放不下老年代了,此时就会触发CMS的 Full GC,大家可以清晰的了解全过程。如果大家对这块有更好的见解以及问题,或者本文有书写错误的地方,也可以进行评论交流。点点关注哦!!!谢谢支持!

gc日志一般关注什么_JVM(23)JVM的Full GC日志相关推荐

  1. java 程序执行后 强制gc_【GC系列】JVM的常用GC参数及GC日志解析

    今天继续GC系列第三篇,熬夜不易,欢迎一键三连,给个鼓励,不点赞也没关系,我还可以,谢谢捧场[捂脸]. 常见垃圾回收器组合设定 在oracle官网上可以看到如何开启使用指定垃圾回收的命令: https ...

  2. JVM实用参数 GC日志

    为什么80%的码农都做不了架构师?>>>    原文章地址:http://blog.panaihua.com/archives/151 GC日志是一个很重要的工具,它准确记录了每一次 ...

  3. gc日志一般关注什么_记一次生产频繁出现 Full GC 的 GC日志图文详解

    场景描述 相信大家都了解 jps.jmap.jstack 等常用 java 堆栈输出命令,有过 dump.gc 分析的经验,面试中会经常被问到有关 JVM 问题,比如你是否了解你的程序在生产环境的基础 ...

  4. JVM基础系列第14讲:JVM参数之GC日志配置

    说到 Java 虚拟机,不得不提的就是 Java 虚拟机的 GC(Garbage Collection)日志.而对于 GC 日志,我们不仅要学会看懂,而且要学会如何设置对应的 GC 日志参数.今天就让 ...

  5. 【Flink】Flink jvm参数配置GC日志

    1.概述 转载:Flink jvm参数配置GC日志 生产环境上,或者其他要测试 GC 问题的环境上,一定会配置上打印GC日志的参数,便于分析 GC 相关的问题. 但是可能很多人配置的都不够" ...

  6. gc日志一般关注什么_理解GC日志

    title: 理解GC日志 comments: false date: 2019-07-16 10:25:52 description: 理解 GC 打印的回收日志内容 categories: GC ...

  7. idea本地跑如何看gc日志_不可思议,竟然还有人不会查看GC垃圾回收日志?

    日志的重要性,不需要过多强调了.通过日志,我们可以发现程序可能有内存(泄露)问题.本文从案例出发,具体介绍这些日志信息,以期帮助大家更好地了解垃圾回收的运行情况. 还是先上图,看看本文的主要内容: 我 ...

  8. JVM学习之GC常用算法

    2019独角兽企业重金招聘Python工程师标准>>> 出处:博客园左潇龙的技术博客--http://www.cnblogs.com/zuoxiaolong,多谢分享 GC策略解决了 ...

  9. JVM从入门到精通(七):GC常用参数,Method Area,JVM调优案例分析

    GC常用参数 -Xmn -Xms -Xmx -Xss 年轻代 最小堆 最大堆 栈空间 -XX:+UseTLAB 使用TLAB,默认打开 -XX:+PrintTLAB 打印TLAB的使用情况 -XX:T ...

最新文章

  1. 利用WebClient和WebRequest类获得网页源代码C#
  2. git 基本操作语句
  3. Python 模块之 time datetime
  4. BP神经网络相关知识
  5. P3951,jzoj5473-小凯的疑惑【数论】(NOIP2017提高组)
  6. Java中的记录器 - Java日志示例
  7. setuptools Declaring Dependencies
  8. 学点 C 语言(22): 数据类型 - 多维数组与指针
  9. 使用cocoapods install友盟时报错Error installing UMengAnalytics
  10. 二进制与格雷码互相转换
  11. css画钟表_css3实现钟表效果
  12. 安全系列之一——SYS-VUL-0048漏洞
  13. python 开机自动切换必应壁纸
  14. Ubuntu 向日葵被远控无法显示图形化界面的解决方案
  15. python基础 (一)import用法
  16. 用酒精,湿巾,擦笔记本电脑/键盘,然后触摸板就不能用了?什么情况?
  17. 前端基础知识点-每天一个基本知识点(100+个前端小知识,你是否都知道?)
  18. php 实现二叉树的最大深度_PHP实现二叉树的深度优先遍历(前序、中序、后序)和广度优先遍历(层次)...
  19. php 随机获取字母,深入PHP获取随机数字和字母的方法详解
  20. 基于FPGA的图像平滑处理

热门文章

  1. arcengine 图层中节点抽稀功能(c++)
  2. GDB Checkpoints
  3. Cilium提供并透明地保护应用程序工作负载之间的网络连接和负载平衡:什么是eBPF和XDP?
  4. DPDK PMD( Poll Mode Driver)轮询模式驱动程序
  5. python3l下载_lunix 安装python3
  6. java编写一个框架_手把手教你写一个基于 RxJava 的扩展框架
  7. centos下mysql 命令,CentOS下mysql 常用命令
  8. 容器安全 - 利用特权模式运行的容器,实现容器逃逸和入侵
  9. (四)为深度伪造预处理数据集
  10. Mongo DB教程及SQL与Mongo DB查询的映射