QCon 演讲火热征集中,快来分享技术实践与洞见! 了解详情
写点什么

金融福尔摩斯修炼册 -FULL GC 篇

  • 2020-03-22
  • 本文字数:1801 字

    阅读完需:约 6 分钟

金融福尔摩斯修炼册-FULL GC篇

报警

上周四微信上收到智能告警,某应用出现 full gc 频繁问题,初步观察了下 sgm 和线上机器情况,定位问题。每次告警都是对我们每个金融消防员的考验:如履薄冰,胆战心惊。


立案调查

  • 分析依据:发生 fullGC 的最常见情况是老年代或者永久代空间不足时。

  • 现场分析:通过 SGM 查看老年代和永久代的空间占比剩余空间还有一定比例,不至于发生 fullGC,发生原因最后分析。



另外 sgm 上看了下 jvm 监控,发现堆内存从 14 号上午窜上去后再没下来过,下面这个图很容易定位是发生了内存泄漏,以下的思路就顺着定位内存泄漏的程序进行



  • 排查:看了下 mapi 代码提交记录,近期无上线,初步排除新上线代码问题。



在 sure 上使用 jmap 命令,发现 char 占据大量内存,怀疑存在大字符串。



周五找运维下了一份详细的 dump 文件,使用亮哥之前分享过的 IBMHeapAnalyzer 工具,分析发现问题可能出在 EnterRealNameApplyUploadImgReqModel 类里,这个类是用于实名申请时图片上传接口的入参实体类,里面包含了图片的 base64 的 string 串,占用较大空间。



排查 mapi 底层 biz 系统,查看 EnterRealNameApplyUploadImgReqModel 对应的实现类,发现 biz 中有对图片大小进行限制,最大为 2M,但是 mapi 无限制,怀疑可能为此接口中上传图片过大。


经磊哥点拨,发现 sdk 中对 base 串做了加密,并在 mapi 中做了解密处理,加解密工具为静态(static)工具方法,可能导致内存泄漏。



定位到问题后,再使用亮哥推荐的 visualVM 插件,在本地启了 mapi 应用,在 sdk 写了个死循环去调图片上传接口,并故意将照片设置为 3M,同时在 idea 的 VM Option 中 JVM 内存调至 300M,此时效果如下:



可以很清楚的发现,old 区增长速度特别快,同时 gc 次数频繁,并且无法有效的降低 old 区占用,old 区整体呈现递增趋势,很容易发生内存溢出,经过之前的定位流程,猜测为图片本身较大,在亚当区无法容纳该对象时,直接塞到 old 区,同时加解密方法为静态方法,被持续引用,导致无法进行垃圾回收,导致 old 区持续递增。

定案

处理方案


  • 生产服务器的内存为 8G,将堆内存从 2G 扩到 4G

  • 图片上传接口不在走通用加解密流程,在 sdk、mapi 单独为其封装了一套特殊的加解密流程,base64 串不进行加密,直接做拼接处理,其余参数做加解密。处理后效果如下:



处理后可以很明显的发现无论是 Old Gen 区的递增速度还是 gc 次数相较于之前发生了很大的变化,趋于正常。

案中案-CPU 分析

以上过程其实问题已经得到解决,但发现频繁报 fullgc 的机器,cpu 一直占用在 10%以上,怀着打破砂锅问到底的态度对 cup 的问题也进行了下分析:


1、通过 top 命令查看占用 cpu 过高的进程



可以看到占用 cpu 的进程 PID 为 7975


2、通过命令查找到占用 cpu 最高的线程


命令:top -H -p [进程id] top –H –p 7975



3、将线程号转化为 16 进制(jstack 线程堆栈中使用的 16 进制)


printf "%x\n" [线程id]



4、 查找线程号对应的线程


执行: jstack [进程id] |grep -A 10 [线程id的16进制]



由上图可以看到,一直在占用 CPU 的线程是 CMS 垃圾回收线程,由于堆内存占用过高程序又不释放,垃圾回收线程一直在尝试回收内存导致 cpu 过高。

并案分析-垃圾回收原因

上面再分析触发垃圾回收的时候留了一个小尾巴,为什么老年代和永久代占用不高的时候频繁的发生了 full gc 呢。由于此应用使用的是 jdk1.6,垃圾回收器使用的是 CMS,它是基于“标记–清除”算法实现的,特点是在收集结束的时候会有大量的空间碎片产生。空间碎片太多的时候,将会给大对象的分配带来很大的麻烦,往往会出现老年代还有很大的空间剩余,但是无法找到足够大的连续空间来分配当前对象的,只能提前触发 full gc。如果 jdk 调整为 1.7u4 及以上即可使用 G1 垃圾回收算法不会产生大量的空间碎片。

结案总结

JVM 问题一般不是很容易遇到,程序有 bug 或者并发量大的时候均可能导致 jvm 异常,通过以上问题的分析过程及以往的经验简单总结下排查 jvm 问题的一般思路:


  • 查看 jvm 内存和机器 CPU 情况

  • 内存占用过高,可能是发生内存泄漏,需要导出 dump 文件借助 mat 或者是 IBM HeapAnalyze 来分析内存中哪些对象占比比较高,那些实例较多的对象需要重点分析

  • cpu 占用过高时可以通过步骤 4 的分析定位到具体的线程,程序编码中用到多线程的地方一定要给线程起个有意义的名字不要用默认的名字,这样出问题时方便定位。


上面只是个大概的流程,具体问题还需具体分析,重点还是需要 掌握 jvm 原理并灵活应用


2020-03-22 21:04819

评论

发布
暂无评论
发现更多内容

通过Gitea实现内外网repo管理

吴脑的键客

git

SpringBoot如何优雅地进行响应数据封装、异常处理?

程序员小毕

Java 源码 程序员 面试 spring-boot

多图预警!华为 ECS 与 阿里云 ECS 对比实战【华为云至简致远】

科技云未来

华为云 虚拟私有云VPC ECS

利用华为云ECS服务器搭建安防视频监控平台【华为云至简致远】

科技云未来

nginx securecrt RTMP SSH工具

Tinymce plugins [Tinymce扩展插件集合]

Five

插件开发 tinymce 富文本编辑器 8月月更

大型连锁百货运维审计用什么软件好?有哪些功能?

行云管家

IT运维 运维审计 运维软件 百货

基于ModelArts的动漫头像自动生成丨【华为云至简致远】

科技云未来

华为云ModelArts

字节算法大神手写算法笔记,已连续多次霸榜 GitHub Trending 首页

冉然学Java

GitHub 算法 Java 分布式 字节

大数据培训学习开发技术费用

小谷哥

使用域名注册服务 Domains配置域名【华为云至简致远】

科技云未来

域名配置 端口映射

使用华为HECS云服务器打造Telegraf+Influxdb+Grafana 监控系统【华为云至简致远】

科技云未来

Grafana Influxdb 系统管理 开源监控系统 提高效率

Webpack5新特性:使用 Assets Module 处理图片和字体资源

昆吾kw

前端 前端工程化 webpack

阿里大佬力荐的这份“Spring全家桶”太强了,在轻松中学习掌握

Java工程师

Java spring spring-boot

阿里巴巴2022最新Java架构师进阶宝典!助力程序员金九银十面试跳槽涨薪

程序员小毕

Java 程序员 架构 面试 算法

Android技术分享| 一对一音视频呼叫邀请开发流程(一)

anyRTC开发者

android 音视频 移动开发 视频通话 呼叫邀请

拿来即用!Get计算机视觉核心知识,看这本书就够了!

博文视点Broadview

上海web前端培训课程

小谷哥

Mysql 生成排序序号

六月的雨在InfoQ

8月月更

tinymce 如何实现动态国际化

Five

插件开发 tinymce 富文本编辑器 8月月更

leetcode 448. Find All Numbers Disappeared in an Array 找到所有数组中消失的数字(简单)

okokabcd

数组 LeetCode 数据结构与算法

大数据程序员培训学习多长时间可以找工作

小谷哥

ffplay视频播放原理分析

百度Geek说

音视频

什么是研发效能的「黄金三角」?如何助力企业提升效能?

万事ONES

兆骑科创高层次人才引进平台,创新创业赛事活动路演

兆骑科创凤阁

Jupyter Notebook 交互式编程 & 低代码拖拽式编程 | 数据科学生态下的理想平台

ModelWhale

云原生 Jupyter Notebook 数据科学 低代码开发 协作平台

为什么Spring Boot项目加上就可以更新版本?

冉然学Java

程序员 源码分析 springboot Java 分布式 Java core

安全狗《云原生安全威胁分析报告》首次提出双检测模型

Geek_2d6073

TiFlash 计算层概览

TiDB 社区干货传送门

数据库 分布式数据库 TiDB

源码阅读其实很简单!阿里业务架构师手写JDK源码笔记(2022版)真香

Java永远的神

Java 程序员 面试 程序人生 jdk源码

如何在 UE4 中制作一扇自动开启的大门

HelloWorld杰少

8月月更

树莓派 USB摄像头 实现网络监控( MJPG-Streamer)

Five

树莓派 网络监控 #web 8月月更

金融福尔摩斯修炼册-FULL GC篇_文化 & 方法_京东数字科技产业AI中心_InfoQ精选文章