JVM系统优化实践(15):GC可视化工具实践

news2024/11/16 21:31:02

您好,我是湘王,这是我的CSDN博客,欢迎您来,欢迎您再来~


线上系统的JVM监测要么使用jstat、jmap、jhat等工具查看JVM状态,或者使用监控系统,如Zabbix、Prometheus、Open-FaIcon、Ganglia等。作为一个工具人,怎么能不懂jstat、jmap、jhat呢?

先来模拟一个BI(商业报表)系统。

一、环境:

JDK1.8_202_build-b08;

Windows 10 × 64位企业版(发行版本号15063)。

二、相关的JVM参数是:

-XX:InitialHeapSize=209715200 -XX:MaxHeapSize=209715200 -XX:NewSize=104857600 -XX:MaxNewSize=104857600 -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=15 -XX:PretenureSizeThreshold=3145728 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/home/work/logs/gc.log

三、示例代码:

 

如果看过前面的文章,就可以从JVM参数推断出:

1、年轻代100M,其中Eden区80M,S0和S1各10M;

2、老年代100M;

3、使用ParNew + CMS垃圾回收算法;

4、分配的对象大小 > 3M直接进入老年代;

5、年轻代对象年龄 > 15时,进入老年代。

四、模拟步骤:

1、先启动程序运行;

2、通过JPS得到Java程序的PID;

3、使用jstat命令: jstat -gc [PID]或者jstat -gc [PID] 1000 1000。

得到GC日志结果,如图:

 

 

 

注意红框框的地方,可以看出:

1、Eden区从3276.8,逐步升至77588.4

2、当经过15秒,再分配对象发现已经超过eden空间大小时,触发YGC

3、首次YGC耗时3ms,S1:0 -> 720.7

YGC执行完后,S1大小 = 720.7,Eden大小 = 1805.6。经过15秒,Eden区再次从1805.6升至81920.0,触发第二次YGC。第二次YGC耗时1ms(总耗时4ms),S1:720.7 -> 0,S0:0 -> 875.4

 

如此循环交替,存活对象也在不断累积,但没有对JVM造成任何影响。Full GC发生的频率趋于0。不过可以试着让这个程序运行足够长的时间,反复观察YGC之后的eden、S0/S1和老年代的变化,看看是否会发生Full GC。

再来一个案例:一个亿级流量的实时日志采集系统。

1、每分钟执行100次计算,每次计算耗费10秒,需要消耗10M空间;

2、年轻代老年代各1.5G,年轻代按8:1:1分配;

3、eden=1.2G,S0=S1=100M;

4、每分钟会触发一次Young GC;

5、每次Young GC大概会有200M的存活对象;

6、每7分钟会触发一次Full GC;

7、频繁触发Full GC的主要原因在于S0/S1区空间太小。

一、环境:

1、JDK1.8_202_build-b08;

2、Windows 10 × 64位企业版(15063)。

二、相关JVM参数:

-XX:InitialHeapSize=209715200 -XX:MaxHeapSize=209715200 -XX:NewSize=104857600 -XX:MaxNewSize=104857600 -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=15 -XX:PretenureSizeThreshold=20971520 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/home/work/logs/gc.log

三、示例代码:

 

四、从JVM参数得知:

1、年轻代100M,其中Eden区80M,S0和S1各10M;

2、老年代100M;

3、使用ParNew + CMS垃圾回收算法;

4、分配的对象大小 > 20M直接进入老年代;

5、年轻代对象年龄 > 15时,进入老年代。

五、模拟步骤:

1、先启动程序运行;

2、通过JPS得到Java程序的PID;

3、使用jstat命令: jstat -gc [PID]或者jstat -gc [PID] 1000 1000。

通过jstat -gc [PID] 1000 1000得到如下GC日志:

 

 

从日志可以得知:

1、第1次Young GC后,就有30M对象存活,S0/S1放不下,直接进入老年代;

2、每隔1秒就触发1次Young GC,每次都有10~20M存活对象进入老年代;

3、当Young GC转移过来的存活对象老年代放不下或者空间也快占满时,触发Full GC;

4、Full GC也被频繁触发,基本上也是几秒钟就触发一次;

5、从第17次Young GC开始,S0=S1=0,而且到第146次之后,Full GC就不再被触发了;

6、可以发现Young GC比Full GC要慢,是因为它触发Full GC后,必须等Full GC执行完了,老年代有了足够的空间才能继续往里放存活对象。

最大的问题是Young GC后每次存活的对象太多,导致S0/S1空间不足,直接进入老年代,频繁触发Full GC。所以,需要对JVM进行优化,只需要调大年轻代即可:

-XX:InitialHeapSize=314572800 -XX:MaxHeapSize=314572800 -XX:NewSize=209715200 -XX:MaxNewSize=209715200 -XX:SurvivorRatio=2 -XX:MaxTenuringThreshold=15 -XX:PretenureSizeThreshold=20971520 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/home/work/logs/gc.log

增加了-XX:SurvivorRatio=2这个JVM参数。

顺便说一句:注意不要在JVM实验中钻牛角尖,因为eclipse等IDE,包括笔记本硬件、操作系统,都会对实验结果产生影响。核心是理解原理,然后结合实验结果去分析大的原理,而不是扣细微的细节,JVM自身内置会产生一些对象,所以对象占用之类的,都是不一样的。


感谢您的大驾光临!咨询技术、产品、运营和管理相关问题,请关注后留言。欢迎骚扰,不胜荣幸~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/419942.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pyg的NeighborLoader和LinkNeighborLoader

NeighborLoader 1 数据格式要求 需要传入加载的属性值: class NeighborLoader(data: Union[Data, HeteroData, Tuple[FeatureStore, GraphStore]], num_neighbors: Union[List[int], Dict[Tuple[str, str, str], List[int]]], input_nodes: Union[Tensor, None…

进程调度的基本过程

进程调度的基本过程🔎 进程是什么🔎 进程管理🔎 进程中结构体的属性进程标识符(PID)内存指针文件描述符表结构体中与进程调度相关的属性进程的状态进程的优先级进程的上下文进程的记账信息🔎 总结🔎 结尾🔎…

(第十四届蓝桥真题) 整数删除(线段树+二分)

样例输入: 5 3 1 4 2 8 7 样例输出: 17 分析:这道题我想的比较复杂,不过复杂度还是够用的,我是用线段树二分来做的。 我们用线段树维护所有位置的最小值,那么我们每次删除一个数之前先求一遍最小值&a…

停车场管理系统文件录入(C++版)

❤️作者主页:微凉秋意 ✅作者简介:后端领域优质创作者🏆,CSDN内容合伙人🏆,阿里云专家博主🏆 文章目录一、案例需求描述1.1、汽车信息模块1.2、普通用户模块1.3、管理员用户模块二、案例分析三…

mysql:使用终端操作数据库

登录进入终端: mysql -u root -p 展示数据库 SHOW DATABASES; 创建数据库: CREATE DATABASE IF NOT EXISTS RUNOOB_TEST DEFAULT CHARSET utf8 COLLATE utf8_general_ci; 1. 如果数据库不存在则创建,存在则不创建。 2. 创建RUNOOB_TEST数据库…

ElasticSearch安装、启动、操作及概念简介

ElasticSearch快速入门 文件链接:https://pan.baidu.com/s/15kJtcHY-RAY3wzpJZIn4-w?pwd0k5a 提取码:0k5a 有些软件对于安装路径有一定的要求,例如:路径中不能有空格,不能有中文,不能有特殊符号&#xf…

JUC并发编程之ReentrantLock

1. 非公平锁实现原理 加锁解锁流程 构造器默认实现的是非公平锁 public ReentrantLock() {sync new NonfairSync();}NonfairSync 继承 Sync, Sync 继承 AbstractQueuedSynchronizer 没有竞争时 第一个竞争出现时 Thread-1 执行了 CAS 尝试将state 由 0 改为 1&…

Stable Diffusion免费(三个月)通过阿里云轻松部署服务

温馨提示:划重点,活动入口在这里喔,不要迷路了。 其实我就在AIGC_有没有一种可能,其实你早就在AIGC了?阿里云邀请你,体验一把AIGC级的毕加索、达芬奇、梵高等大师作画的快感。阿里云将提供免费云产品资源&…

如何使用evosuite为指定被测方法生成测试用例

目录 省流版本 准备工作 环境 evosuite获取 检验环境 参数解释 怎样表示被测方法 怎样指向被测类 其他参数 参考 省流版本 java -jar .\target\depd\evosuite-1.1.0.jar -generateTests -Dtarget_method"isLenient()Z" -class com.google.gson.stream.…

Midjourney教程(二)——Prompt基本结构

Midjourney教程——Prompt基本结构 Basic Prompt 基础版本的prompt仅仅包含图片的描述,能够满足普通的需求,如下图所示 Advanced Prompt 高级版本的prompt主要包含三个部分,如下图所示 Image Prompts(可选) prompt第一部分是Image&#x…

TCP/IP协议详解

一.引言TCP/IP 是 TCP 和 IP 两种协议群的统称,具体来说,IP 或 ICMP、TCP 或 UDP、TELNET 或 FTP、以及 HTTP 等都属于 TCP/IP 协议二.计算机网络体系结构分层计算机网络体系结构分层计算机网络体系结构分层不难看出,TCP/IP 与 OSI 在分层模块…

【C语言】迷宫问题

【C语言】迷宫问题一. 题目描述二. 思想2.1 算法---回溯算法2.2 思路分析图解三. 代码实现3.1 二维数组的实现3.2 上下左右四个方向的判断3.4 用栈记录坐标的实现3.5 完整代码四. 总结一. 题目描述 牛客网链接:https://www.nowcoder.com/questionTerminal/cf2490605…

STM32看门狗

目录 独立看门狗 IWDG 什么是看门狗? 独立看门狗本质 独立看门狗框图 独立看门狗时钟 分频系数算法: ​编辑 重装载寄存器 键寄存器 溢出时间计算公式 独立看门狗实验 需求: 硬件接线: 溢出时间计算&#xff1…

macOS设置环境变量和别名

因为我的mac所用shell是bash,所以本文中涉及的环境变量和别名配置均在~/.zshrc文件中,且在每次配置完成后,需要执行source ~/.zshrc命令使配置文件生效 环境变量 通过配置环境变量,我们可以将某个路径暴露到全局,这样可以在全局…

周总结(第一周)

3月份3个星期 *** 三个星代表不会 ** 再做 * 加强 题目1-完全二叉树(记忆) 考察数据结构 完全二叉树的深度deplog2(N1)1 完全二叉树节点的深度depiceil(log2(i1))向上舍入 完全二叉树的层次遍历,遍历每层的二叉树计算基础每层的总和,然后找出最大的和…

Talk预告 | 新加坡国立大学郑奘巍 AAAI‘23 杰出论文:大批量学习算法加速推荐系统训练

本期为TechBeat人工智能社区第486期线上Talk! 北京时间3月30日(周四)20:00,新加坡国立大学二年级博士生——郑奘巍的Talk将准时在TechBeat人工智能社区开播! 他与大家分享的主题是: “大批量学习算法加速推荐系统训练”,届时将分…

Kubernetes 多集群网络方案系列 2 -- Submariner 监控

Submariner 是一个用于连接 Kubernetes 集群的跨集群网络解决方案,可以实现集群之间的服务发现、网络通信等功能。 Prometheus 是一个开源的监控和告警系统,专门用于收集、存储和查询各种应用、系统和基础设施的实时指标数据。Prometheus 具备多维数据模…

Java开发 - MySQL主从复制初体验

前言 前面已经学到了很多知识,大部分也都是偏向于应用方面,在应用实战这条路上,博主一直觉得只有实战才是学习中最快的方式。今天带来主从复制给大家,在刚刚开始动手写的时候,才想到似乎忽略了一些重要的东西&#xf…

面试篇-揭开Spring Bean加载的神秘面纱

SpringBean加载完整过程 启动spring容器(创建beanfactory)->加载配置(注解、xml)->实例化bean(执行构造方法)->注入依赖->初始化bean(设置属性值)->使用->销毁 解析和读取 XML 配置文件或注解配置类&#xff0…

Linux嵌入式学习之Ubuntu入门(五)汇编语法学习

系列文章目录 一、Linux嵌入式学习之Ubuntu入门(一)基本命令、软件安装及文件结构 二、Linux嵌入式学习之Ubuntu入门(二)磁盘文件介绍及分区、格式化等 三、Linux嵌入式学习之Ubuntu入门(三)用户、用户组…