JVM系统优化实践(22):GC生产环境案例(五)

您好,这里是码农镖局CSDN博客,欢迎您来,欢迎您再来~


除了Tomcat、Jetty,另一个常见的可能出现OOM的地方就是微服务架构下的一次RPC调用过程中。笔者曾经经历过的一次OOM就是基于Thrift框架封装出来的一个RPC框架导致的宕机。

 

也就是当服务A更新后,服务B宕机了。

通过查看GC日志,发现是JVM堆抛出的OOM。打开内存快照,发现超大byte[]数组,而这个超大的byte[]数组是由RPC框架持有的。

 

初步判定原因是:服务A修改了Request类,但服务B未更新该类,还是旧版本,因此导致反序列化失败时RPC会开辟一个byte[]数组,默认大小是4G。

 

因此最终的解决方案也很简单:

1、服务B更新Request类;

2、将RPC默认byte[]数组大小调整为4M。

另一次事故是由马虎的开发工程师引起的。某个马虎的工程师用mybatis写的SQL语句在某些情况下允许不加where条件就可以执行,这导致一下子查出来上百万条数据,引发系统OOM。这种情况下,MAT工具对由Web容器(Tomcat/Jetty)或者RPC等底层框架所引发的OOM故障,用处并不大。但如果OOM主要是由于业务代码导致,那使用起来就简单得多。使用MAT工具定位问题的时候:

1、利用histogram功能占用内存最多的对象

2、找到占用内存过多的对象,并深入看看对象之间的持有关系

3、找到问题代码

与前面的RPC引发的OOM类似,有一个线上数据同步系统,专门从另一个系统同步数据,通过kafka来发送与消费数据。即使是这么简单的一个系统,也会不时地报一个OOM错误,且频率越来越高。这难道又是工程师的粗心引起的吗?

 

通过简单分析可以知道,既然每次重启过后都会频繁出现OOM,就说明内存使用率会不断上涨且难以清理。而JVM出现OOM,一般都是由两种情况引起:

1、要么高并发高负载,一瞬间创建太多对象,导致内存放不下

2、要么存活对象太多,GC无法回收

而针对此案例,极有可能就是第二种情况:存活对象太多。

 

这一点可以通过jstat来验证。重启系统后,启动jstat,观察到:

1、老年代持续增长,且老年代使用率达到100%后,Full GC根本回收不掉任何对象

2、老年代维持一段时间的100%使用率后,发生OOM

同时通过MAT找到占用内存最多的对象。利用Histogram功能,最终发现问题原因:

1、kafka的吞吐量和数据库的吞吐量完全不是一个数量级;

2、数据库的处理能力慢,导致数据不断积压,最终内存溢出;

3、典型的没控制好生产与消费数据的速率导致的OOM。

 

最后总结一下这几个案例:

1、必须对线上系统使用的各种技术,从服务器框架,到第三方框架,到Tomcat/Jetty等Web服务器,再到各种底层的中间件系统,都有深入的理解;

2、一般线上系统的故障,极少数是由业务代码直接导致的——更一般的情况是某个开源技术的内核代码就可能存在一定的故障和缺陷,只是在某些极端场景下才被发现而已;

3、定位、解决OOM问题,需要仔细研究底层源码,再结合线上业务、系统负载、参数配置和系统日志(含GC日志)等多种手段,才能完成;

4、一般情况下禁止显式调用System.gc(),但是如果开发的是文件存储、IM等大量使用NIO技术的应用,就不要禁止System.gc(),但业务代码还是不要出现System.gc();

5、生产环境一不使用parallel垃圾回收器;

6、一个Tomcat就是一个进程,不管在上面部署了多少个应用,都只有一个JVM进程。


感谢您的大驾光临!欢迎骚扰,不胜荣幸~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

swagger对json数据的处理

在实习中遇到了一个不寻常的事情,今天和同事讨论一个小问题,同事使用swagger,想要调用一个接口,这个接口要传递一个json对象,对应java的一个实体类,但是有一个属性同事不想看到它,就用JsonIgnor…

【学会动态规划】按摩师(11)

目录 动态规划怎么学? 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后: 动态规划怎么学? 学习一个算法没有捷径,更何况是学习动态规划, 跟我…

【Linux】信号保存信号处理

前言:对信号产生的思考 上一篇博客所说的信号产生,最终都要有OS来进行执行,为什么?OS是进程的管理者!信号的处理是否是立即处理的?在合适的时候 -》那什么是合适的时候?信号如图不是被立即处理…

企业知识管理系统安全是重中之重

企业开展知识管理工作的益处是全方位的,效果能从业务的各方面得到体现,最终效果就是企业竞争力的提升与企业经营业绩的提升。 知识管理系统的意义在于,构建系统的知识库,对纷杂的知识内容(方案、策划、制度等&#xf…

IDE/mingw下动态库(.dll和.a文件)的生成和部署使用(对比MSVC下.dll和.lib)

文章目录 概述问题的产生基于mingw的DLL动态库基于mingw的EXE可执行程序Makefile文件中使用Qt库的\*.a文件mingw下的*.a 文件 和 *.dll 到底谁起作用小插曲 mingw 生成的 \*.a文件到底是什么为啥mingw的dll可用以编译链接过程转换为lib引导文件 概述 本文介绍了 QtCreator mi…

MySQL的基本概念(数据库类、数据模型、服务启动与连接)

目录 数据库基础 DB和DBMS 数据库的类型 RDBMS的结构 MySQL的服务启动与连接(Windows系统下) 服务启动 客户端连接 数据库基础 DB和DBMS 什么是DB 将大量的数据保存起来,通过计算机加工而成的可以进行高效访问的数据集合就成为数据…

cc2500 怎么计算理论输出频率

一、需要已知的数据 外部晶振频率(26MHz -28MHz)FREQ2 - 频率控制词汇,高字节FREQ1 - 频率控制词汇,中字节FREQ0 - 频率控制词汇,低字节 二、计算方法 1. 公式 Fxosc 指的是外部晶振的频率。FREQ [ 23 : 0 ] : 指的…

Navicat远程连接服务器失败 2002 - Can‘t connect to server on ...(10060)

报错如下: 2002 - Can’t connect to server on ‘192.168.33.59’(10060) 解决方案: 下面列举可能出现的几种情况: 1.防火墙原因,需要关闭防火墙 systemctl stop firewalld systemctl disable firewalld2.数据库未开启&#x…

【OpenCV】常见问题及解决办法

文章目录 0 前言1 中文乱码问题2 非法路径问题 0 前言 本篇博客主要是总结OpenCV使用过程中遇到的一些问题,以及对应的解决办法,这里重点是关注OpenCV,既有基于C的,也有基于Python的,比较全面,而且也会随着…

格式工厂5.10.0版本安装

目前格式工厂有很多,大多都可以进行视频转换 之前遇到一个用ffmpeg拉流保存的MP4在vlc和迅雷都无法正常播放的问题,发现视频长度不对,声音也不对,最后换到了格式工厂的格式播放器是可以正常播放的 格式工厂下载之家的地址 http…

【docker】docker

目录 一、docker概念二、docker安装(centos7)三、docker架构3.1 镜像image3.2 容器container 四、配置docker镜像加速器五、docker命令5.1 docker服务命令5.2 docker镜像命令5.3 docker容器命令 六、docker容器的数据卷6.1 容器卷概念及作用6.2 配置数据卷6.3 挂载示例6.4 数据…

Android 屏幕适配各种宽高比的手机

由于android 手机的屏幕宽高比样式太多了,在设计UI时,很多时候,会因为宽高比,分辨率不同会有展示上的差异。 我是这样解决的 在activity的onCreate方法前,调用: fun screenFit(context: Context) {val me…

深度学习中标量,向量,矩阵和张量

1.标量(Scalar) 只有大小没有方向,可用实数表示的一个量 2.向量(Vector) 可以表示大小和方向的量 3.矩阵(Matrix) m行n列,矩阵中的元素可以是数字也可以是符号,在深度学习中一般是二维数组 4.张量(Tensor) 用来表示一些向量、标量和其他张量之间的…

详解zookeeper安装使用

目录 1.概述 1.1.功能 1.2.特点 1.3.数据结构 2.安装 2.1.Windows 2.2.Linux 3.基础操作 3.1.增 3.2.删 3.3.改 3.4.查 3.5.监听 4.JAVA操作Zookeeper 4.1.依赖 4.2.客户端 4.3.增 4.4.删 4.5.查 4.6.改 1.概述 1.1.功能 zookeeper,Apache旗下…

K8S初级入门系列之二-集群搭建

一、前言 为了更好学习K8S,建议自行搭建一套K8S的环境,目前比较流行的有两种搭建工具,一种是单机版的minkube,一种是集群版的kubeadm。minkube更多是用于实验环境,且单机版隐藏了很多细节,而kubeadm更贴近实…

【C语言】指针---初阶

🍁 博客主页:江池俊的博客 🍁收录专栏:C语言——探索高效编程的基石 🍁 如果觉得博主的文章还不错的话,请点赞👍收藏🌟 三连支持一下博主💞 目录 一、指针是什么? 1.1指…

2min搞定 mac pycharm新建导入python项目

mac pycharm新建和导入python项目&虚拟环境配置&下载类库 一、通用设置step1 、通过自定义配置,指定默认虚拟环境变量step2、设置虚拟环境和指定默认工作空间step3 、导入或者新建python项目 二、pycharm新建python项目step1、点击新建【file->newProjec…

抖音、美团、华为“巧”搅支付春水

配图来自Canva可画 如今,移动支付已经成了当下最流行的支付方式,从小吃店到大商超,从地铁、公交到飞机、高铁,移动支付的应用场景层出不穷,可以说,现代人的生活已经离不开移动支付了。而在此背景下&#x…

动态内存常见的问题

对空指针的解引用 改正后的代码: 返回栈(临时变量)空间地址的问题 释放空间后及时把指针设为空 void Test(void) {char* str (char*)malloc(100);strcpy(str, "hello");free(str);str NULL;//释放空间后及时把指针设为空if (s…

25-30天每日强训选择题改错解析

int i5; int s(i)(i)(i–)(–i); s( )//s 的值是什么? A 28 B 25 C 21 D 26 E 24 F 23 正确答案: E 5775 24 或者 --在后先不变化数值 -- 在前先变化再运算 以下哪项不属于java类加载过程? A 生成java.lang.Class对象 B int类型对象成…