JVM系统优化实践(17):线上GC案例(二)

news2025/1/30 16:22:25

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


GC的概念并不难明白,而且它的原理也不复杂,但是很难用好。为什么?因为每个平台、架构、指标、运行环境都不一样,甚至(新手)工程师的编码习惯都不一样,随手的一段代码可能就给运维优化带来巨大压力。所以除了需要充分做压测根据实际情况合理设置外,就是大量接触实际案例。那么接下来,会有很多案例陆续发布。

一次线上大促,需要在特定时间段,给所有用户发短信、邮件及其他消息,以此来吸引比平时多几倍的大量用户参与,通过监控系统,得知CPU卡死,而且更严重更牛逼的问题是:重启无效!

我们知道,CPU负载过高的常见原因不外乎:

1、创建了大量的线程且同时并发运行;

2、二、JVM频繁执行GC。

在排查完代码,确定不是因为代码原因造成线程卡死之后,再来排查Full GC问题。使用内存分析工具:MAT。先用jmap导出内存快照,再用jhat或MAT插件分析。MAT插件可以在eclipse的官网下载。

MAT使用方法:

1、修改MemoryAnalyzer.ini文件

-startup

plugins/org.eclipse.equinox.launcher_1.5.0.v20180512-1130.jar

--launcher.library

plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.700.v20180518-1200

-vmargs

-Xmx1024m

2、如果通过jmap导出的dump文件比较大(例如几个G),那么务必在使用MAT之前,先给MAT设置一下堆内存大小,默认1024M。

jmap -F -dump:live,file=dump.hprof [PID](耗时较长)

或者

jmap [PID](快速生成)

 

1、Leak Suspects是基于内存泄漏的分析,尝试找出导致内存泄漏的一批对象;

2、Component是分析对象问题。

通过使用MAT,最终定位问题是:由于线上系统使用了缓存,但既没有限定缓存空间大小,也没有指定LRU算法,导致空间耗尽。

再来,继续。

一次平台版本升级后,系统无法使用,发现是因为CPU负载飙升。

问题定位与排查:

1、通过jstat,发现Full GC每两分钟执行一次,且异常耗时

2、JVM的配置为10G年轻代(Eden:S0:S1 = 8:1:1),10G老年代

3、Eden一分钟就被塞满,且每次Young GC后有几个G的对象进入老年代

4、这说明系统在运行时产生大量的对象,且处理极其缓慢

5、这明显是代码层面的问题,仅靠JVM优化没有用

使用MAT通过分析dump文件的内存泄漏问题,找到问题代码,由于JDK不同版本的特性导致String.split()产生问题。

现在再来整体回顾一下JVM技术的一些基本内容。

一、JVM的GC的运行原理

1、JVM的内存区域划分为年轻代、老年代和元空间;

2、年轻代又分为Eden区、S0、S1;

3、系统运行过程中,会不停在Eden区中创建各种对象;

4、当Eden区塞满之后,执行Young GC,使用复制算法,在S0和S1之间来回复制存活对象;

5、对象在如下情况会进入老年代:年龄划分达到一定阈值、大对象、Young GC后存活对象S0/S1放不下、动态年龄判定规则;

6、老年代Full GC触发规则:老年代已用空间大于老年代空间阈值、Young GC前:老年代可用空间小于历次Young GC后进入老年代的对象的平均大小、Young GC后:老年代空间放不下Young GC后存活对象;

7、老年代的垃圾回收通常使用CMS垃圾回收器;

8、JVM优化的核心内容就是减少Full GC的频率和耗时;

二、如何设置JVM参数

1、首先应该估算每个核心接口每秒的请求次数,以及每次请求所占用的空间大小,进而估算每秒会占用多少空间;

2、估算出Eden区多久会填满,进而估算出多久执行一次Young GC;

3、估算多少对象会升入老年代,用多少空间,多久触发Full GC;

4、通过这样的方式,就可以合理分配年轻代和老年代的空间。

三、JVM参数设置原则

1、尽可能让Young GC后存活的对象远小于S0/S1;

2、尽可能避免对象进入或频繁进入老年代;

3、最理想状态,就是老年代空间使用稳定,几乎不发生Full GC。

四、压测之后合理设置JVM参数

用jstat观察JVM的运行过程,尤其要注意:Eden区的增长速率、Young GC频率、Young GC耗时、Young GC后多少对象存活、老年代增长速率、Full GC频率、Full GC耗时

五、频繁发生Full GC的几种病症(这只是一种参考,就像体温升高不一定就是感冒一样)

1、机器CPU负载过高;

2、频繁Full GC报警;

3、系统响应缓慢。

六、频繁发生Full GC的几种原因

1、系统并发过高,数据处理量过大,导致Young GC频繁,且每次Young GC后存活对象过多;

2、内存空间分配不合理;

3、一次性加载过多数据进入内存;

4、系统发生内存泄漏;

5、元空间的类加载过多;

6、误用System.gc()(System.gc()不是一定不能用,但一定得有前提条件。很多新手喜欢炫技,结果是给自己找麻烦)。

七、JVM中的一些痛点

1、工作中的JVM优化实践;

2、线上系统如何监控GC及定位、分析、解决GC问题;

3、将之前学过的内容全部串起来;

4、将系统负载提高到10倍、100倍来考虑GC问题;

5、把GC问题和业务相结合,深度思考,按照JVM内存运行模型总结几个可能发生的性能问题,然后真理出一套方案;

6、结合业务,总结归纳出公司级别的JVM模板。

八、JVM优化时的注意事项

很多博客会设置一些非常少见的JVM参数,完全是误导。真正的JVM优化:依据业务选择合适的垃圾回收器(如ParNew、CMS、G1),以及经过压测之后根据实际表现调整GC的参数设置。

FAQ:

1、jxl导出excel的时候,会默认调用gc方法,需要注意;

2、jstat一般用于死锁情况的分析,看是哪个线程卡住了;

3、当多个服务竞争某个资源时,可以考虑加上分布式锁,如果并发量高,可以考虑拆分服务,提升吞吐量;

4、一般的redis分布式锁都可以用redisson框架实现;

5、如果选择减少G1的耗时,那么也就意味着G1的GC次数增多;

6、频繁发生Full GC,并不一定是空间太小,甚至根本不是空间问题,需要结合实际业务情况多分析多思考;

7、实际内存消耗往往比数据本身要大很多。

如果上面的看不明白就往回翻,看以前的文章。


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

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

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

相关文章

设计模式-行为型模式之中介者模式

2. 中介者模式 2.1. 模式动机 在用户与用户直接聊天的设计方案中,用户对象之间存在很强的 关联性,将导致系统出现如下问题: 系统结构复杂 对象之间存在大量的相互关联和调用,若有一个对象发生变化,则需要跟踪和该对象关…

初识 MongoDB

文章目录 一、简介二、体系结构三、数据类型四、特点五、应用场景 提示:以下是本篇文章正文内容,MongoDB 系列学习将会持续更新 一、简介 MongoDB 是一个文档数据库,是由字段和值对(field:value)组成的数据结构&…

煤矿电子封条视频监控系统 yolov7

煤矿电子封条视频监控系统基于yolov7python网络模型视频AI智能分析技术,煤矿电子封条视频监控算法模型对现场皮带撕裂、跑偏、皮带异物、堆煤等设备异常状态实时监控分析自动识别预警。YOLOv7 的发展方向与当前主流的实时目标检测器不同,研究团队希望它能…

(原创)Flutter基础入门:装饰器Decoration

前言 作为一个Android开发,最近打算把自己学的Flutter相关知识做个积累,所以这会是一个系列的博客。里面讲的都会是一些Flutter相关的知识,有基础的,也有比较深入的,由浅入深嘛。 那么今天作为开篇,就先讲…

经典回顾丨同为科技(TOWE)在2008年奥运场馆防雷建设中都做了什么?

针对大型体育赛事场馆防雷建设工作非常重要,这是因为大型体育赛事通常吸引了大量的观众和运动员聚集,一旦场馆遭受雷击,可能会造成严重的伤亡和财产损失。如今,大型体育赛事的场馆都会配备防雷设施,如建筑物避雷针、接…

代理设计模式解读

目录 代理模式的基本介绍 静态代理 静态代码模式的基本介绍 应用实例 思路分析图解(类图) 代码实战 静态代理优缺点 动态代理 动态代理模式的基本介绍 JDK 中生成代理对象的 API 代码实战 Cglib 代理 Cglib 代理模式的基本介绍 Cglib 代理模式实现步骤 Cglib 代理模…

同为科技(TOWE)机柜PDU电源插头类型详解

机柜PDU电源插座作为机房服务器众多设备运行的“最后一米”也是最为密切的电源配件,专用于精细保护单相交流供电的敏感设备,其品质好坏直接影响到各个设备的正常运行。机柜PDU电源管理器是由插头、线缆、主体三个部分组成,其中电源插头可以分…

leetcode24. 两两交换链表中的节点

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 示例 1: 输入:head [1,2,3,4] 输出:[2,1…

什么是机器学习?

目录 简介 机器学习可以做什么 机器学习未来的趋势 总结 简介 机器学习是一种人工智能领域中的技术,其主要目的是让计算机能够自动进行模式识别、数据分析和预测。 机器学习的起源可以追溯到20世纪50年代,当时美国的Arthur Samuel在一篇论文中提出了相关…

(转)使用Midjourney进行图生图

原文链接:使用Midjourney进行AI绘画的基础手册-虎课网 接下来,我们讲一下,如果使用Midjourney的垫图功能,创作相同风格的图片 第一步: 1、打开discord,查看自己的服务器 2、我们双击“+”,来上传图片,图片上传后,按下enter发送图片; 图片发送成功后,点击图片放大…

不得不说的创建型模式-单例模式

单例模式是创建型模式的一种,它的作用是确保一个类只有一个实例,并提供全局访问点。单例模式通常用于管理共享资源,如配置文件、数据库连接池等,它可以保证这些资源只被创建一次,并且可以被全局共享。 下面是一个使用C…

AI 智能会有自主意识吗?会不会伤害人?

随着科技的高速发展,人工智能已逐渐融入我们的日常生活。从智能家居设备到自动驾驶汽车,人工智能的应用领域越来越广泛。然而,在这个趋势背后,我们面临着一个极具争议的问题:人工智能是否会觉醒自我意识?我…

程序员阿里三面无理由挂了,被HR一句话噎死,网友:这可是阿里啊

进入互联网大厂一般都是“过五关斩六将”,难度堪比西天取经,但当你真正面对这些大厂的面试时,有时候又会被其中的神操作弄的很是蒙圈。 近日,某位程序员发帖称,自己去阿里面试,三面都过了,却被…

近期遇到的vscode 插件开发的问题,when表达式,正则匹配路径

前言 最近在修改dbt插件的时候,遇到了几个比较奇怪的问题,猜测应该是因为跟新了VSCode导致的。 这里稍微记录一下,如果能帮助其他的同学,那就太值啦。 when 正则表达式 之前有在packgae.json 中使用 when 的正则表达式&#xf…

文章修改润色软件-中文文章自动润色

在今天这个信息爆炸的时代,写作已经成为了生活和工作中不可或缺的一部分。无论是企业宣传材料、项目报告、还是日常沟通,我们都需要写作来表达自己的意见和观点。但是,对于大多数人来说,写作带来的不仅仅是创作的乐趣,…

Nacos 1.4.x 升级至 2.x 详细步骤及遇到的问题

此前使用的nacos版本是1.4.5,现在nacos最新版本为2.2.2,且修复了旧版本的一些安全问题,下面把详细的升级步骤记录一下,大家一起学习。主要参照了nacos官方升级文档:https://nacos.io/zh-cn/docs/v2/upgrading/2.0.0-up…

MongoDB 分片集群架构中的分片策略

一、分片集群架构 1-1、分片简介 分片(shard)是指在将数据进行水平切分之后,将其存储到多个不同的服务器节点上的一种扩展方式。分片在概念上非常类似于应用开发中的“水平分表”。不同的点在于,MongoDB本身就自带了分片管理的能…

【Linux】基于单例模式懒汉实现方式的线程池

目录 一、LockGuard.hpp 二、Task.hpp 三、Thread.hpp 四、ThreadPool.hpp 一、LockGuard.hpp #pragma once #include <iostream> #include <pthread.h> class Mutex//锁的对象 { public:Mutex(pthread_mutex_t* lock_pnullptr):_lock_p(lock_p){}~Mutex(){}v…

设计模式-看懂UML类图和时序图

这里不会将UML的各种元素都提到&#xff0c;只讲类图中各个类之间的关系&#xff1b; 能看懂类图中各个类之间的线条、箭头代表什么意思后&#xff0c;也就足够应对 日常的工作和交流&#xff1b; 同时&#xff0c;应该能将类图所表达的含义和最终的代码对应起来&#xff1b;1.…

Qt音视频开发39-海康sdk回调拿到数据GPU绘制的实现

一、前言 采用海康的sdk做开发&#xff0c;最简单最容易的方式就是传入句柄&#xff08;windows和linux都支持/很多人以为只有windows才支持&#xff09;即可&#xff0c;这种方式不用自己处理绘制&#xff0c;全部交给了sdk去处理&#xff0c;所以cpu的占用是最低的&#xff…