gc日志一般关注什么_JVM(23)JVM的Full GC日志
喜欢文章的可以关注下公众号!谢谢支持!!
之前两篇文章已经分析了对象是如何进入老年代的,接着我们在这篇文章中演示一下,老年代的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日志相关推荐
- java 程序执行后 强制gc_【GC系列】JVM的常用GC参数及GC日志解析
今天继续GC系列第三篇,熬夜不易,欢迎一键三连,给个鼓励,不点赞也没关系,我还可以,谢谢捧场[捂脸]. 常见垃圾回收器组合设定 在oracle官网上可以看到如何开启使用指定垃圾回收的命令: https ...
- JVM实用参数 GC日志
为什么80%的码农都做不了架构师?>>> 原文章地址:http://blog.panaihua.com/archives/151 GC日志是一个很重要的工具,它准确记录了每一次 ...
- gc日志一般关注什么_记一次生产频繁出现 Full GC 的 GC日志图文详解
场景描述 相信大家都了解 jps.jmap.jstack 等常用 java 堆栈输出命令,有过 dump.gc 分析的经验,面试中会经常被问到有关 JVM 问题,比如你是否了解你的程序在生产环境的基础 ...
- JVM基础系列第14讲:JVM参数之GC日志配置
说到 Java 虚拟机,不得不提的就是 Java 虚拟机的 GC(Garbage Collection)日志.而对于 GC 日志,我们不仅要学会看懂,而且要学会如何设置对应的 GC 日志参数.今天就让 ...
- 【Flink】Flink jvm参数配置GC日志
1.概述 转载:Flink jvm参数配置GC日志 生产环境上,或者其他要测试 GC 问题的环境上,一定会配置上打印GC日志的参数,便于分析 GC 相关的问题. 但是可能很多人配置的都不够" ...
- gc日志一般关注什么_理解GC日志
title: 理解GC日志 comments: false date: 2019-07-16 10:25:52 description: 理解 GC 打印的回收日志内容 categories: GC ...
- idea本地跑如何看gc日志_不可思议,竟然还有人不会查看GC垃圾回收日志?
日志的重要性,不需要过多强调了.通过日志,我们可以发现程序可能有内存(泄露)问题.本文从案例出发,具体介绍这些日志信息,以期帮助大家更好地了解垃圾回收的运行情况. 还是先上图,看看本文的主要内容: 我 ...
- JVM学习之GC常用算法
2019独角兽企业重金招聘Python工程师标准>>> 出处:博客园左潇龙的技术博客--http://www.cnblogs.com/zuoxiaolong,多谢分享 GC策略解决了 ...
- JVM从入门到精通(七):GC常用参数,Method Area,JVM调优案例分析
GC常用参数 -Xmn -Xms -Xmx -Xss 年轻代 最小堆 最大堆 栈空间 -XX:+UseTLAB 使用TLAB,默认打开 -XX:+PrintTLAB 打印TLAB的使用情况 -XX:T ...
最新文章
- 利用WebClient和WebRequest类获得网页源代码C#
- git 基本操作语句
- Python 模块之 time datetime
- BP神经网络相关知识
- P3951,jzoj5473-小凯的疑惑【数论】(NOIP2017提高组)
- Java中的记录器 - Java日志示例
- setuptools Declaring Dependencies
- 学点 C 语言(22): 数据类型 - 多维数组与指针
- 使用cocoapods install友盟时报错Error installing UMengAnalytics
- 二进制与格雷码互相转换
- css画钟表_css3实现钟表效果
- 安全系列之一——SYS-VUL-0048漏洞
- python 开机自动切换必应壁纸
- Ubuntu 向日葵被远控无法显示图形化界面的解决方案
- python基础 (一)import用法
- 用酒精,湿巾,擦笔记本电脑/键盘,然后触摸板就不能用了?什么情况?
- 前端基础知识点-每天一个基本知识点(100+个前端小知识,你是否都知道?)
- php 实现二叉树的最大深度_PHP实现二叉树的深度优先遍历(前序、中序、后序)和广度优先遍历(层次)...
- php 随机获取字母,深入PHP获取随机数字和字母的方法详解
- 基于FPGA的图像平滑处理
热门文章
- arcengine 图层中节点抽稀功能(c++)
- GDB Checkpoints
- Cilium提供并透明地保护应用程序工作负载之间的网络连接和负载平衡:什么是eBPF和XDP?
- DPDK PMD( Poll Mode Driver)轮询模式驱动程序
- python3l下载_lunix 安装python3
- java编写一个框架_手把手教你写一个基于 RxJava 的扩展框架
- centos下mysql 命令,CentOS下mysql 常用命令
- 容器安全 - 利用特权模式运行的容器,实现容器逃逸和入侵
- (四)为深度伪造预处理数据集
- Mongo DB教程及SQL与Mongo DB查询的映射