jvm线上内存问题排查
时间:2022-07-24
本文章向大家介绍jvm线上内存问题排查,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
背景:
正在和同事在外面吃饭,突然钉钉报警,有一个服务的机器内存飙到百分之90%多。和同事大概聊了一下说是队列累积,机器消费不过来,具体原因也没有深问,又一同事,说看一下是那个对象占的内存,使用jmap,jstat。当时我也在旁边围观,由于之前有看过,我就说jmap在生产环境敢使用吗?
jmap,jstat的作用?
- jmap 是内存影像工具,jmap用于生成堆转储快照(一般称为dump或者heapdump文件)也可以查看堆内对象示例的统计信息、查看 ClassLoader 的信息以及 finalizer 队列。
- 使用参数
-XX:+HeapDumpOnOutOfMemoryError
,可以让虚拟机在 OOM 异常出现之后自动生成 dump 文件 使用参数
-XX:+HeapDumpOnCtrlBreak
然后使用 Ctrl+Break 生成 在 Linux 系统中使用 kill -3 发送进程退出信号“吓唬”虚拟机,让其生成 dump 文件)
2. jstat (JVM statistics Monitoring Tool)是用于监视虚拟机各种运行状态信息的命令行工具他可以显示本地或者远程虚拟机进程中的类装载,内存,垃圾收集,JIT编译等运行数据,在没有GUI图形界面 ,只提供了纯文本控制台环境的服务器上,他是运行期定位虚拟机的首选工具(周志明说)
jmap实战
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lQojpBgg-1587553128990)(CF4BE02FA6C941DEB23E041B50C4FAE7)]
- 首先我们使用jps命令查看当前运行在JVM上的应用的LVMID也就是我上图的28398
- 拿到这个后使用jmap -dump命令
jmap -dump:format=b,file=dumpHeap.bin 28398
- 执行成功后使用ll就可以看到dump 下来的文件
- 接下来我们可以使用其他的分析工具进行分析 如:jhat ,Visual VM,MAT等。周志明说:能用其他工具就不要用jhat原因是:一般不会在部署应用的服务器上进行分析dump文件,分析dump文件是一件非常耗费硬件资源的过程,第二个原因就是jhat很简陋。所以还是使用将多个功能放在一块的工具Visual VM来进行分析。
Tips : 但是这个dump在生产环境中还是慎用,因为在dump文件的过程中为保证文件的准确性会停止所有的进程的(个人觉得有点类似于gc 中的stop the word)
jstat 实战
- jps获取服务的LVMID
- jstat -gc
- 我们从图中可以观察到 其中 S0 和 S1 指 Survivor0 区和 Survivor1区,E 即 Eden 区,O 指老年代,M 指 MetaSpace,元数据空间,CCS 是压缩使用比例,YGC:年轻代垃圾回收次数,FGC:老年代垃圾回收次数,FGCT:老年代垃圾回收消耗时间,GCT:垃圾回收消耗总时间。当我们拿到了生产上的信息,且进行了分析,那我们就得查看现有的配置。那就是用jinfo
jinfo实战
- 不管怎样我们都得查找到LVMID
- 通过jinfo查看得到该应用程序的现有配置。
- 或者说我们使用的jekins自动化构建工具那我们可以在
cd /usr/local/deploy/supervisord/conf/项目对应的conf文件
- cat 文件进行查看 应用的启动配置的配置文件。
其实不是不可以使用jmap而是jmap -dump的使用的时候需要注意。有可能会导致服务停止!!
- 探寻ASP.NET MVC鲜为人知的奥秘(3):寻找多语言的最佳实践方式
- 探寻ASP.NET MVC鲜为人知的奥秘(2):与Entity Framework配合,让异步贯穿始终
- Canvas 剪切图片
- 探寻ASP.NET MVC鲜为人知的奥秘(1):对LESS的支持
- Canvas 图片平铺设置
- Canvas 给图形绘制阴影
- State模式的经典应用场景:订单处理(c#实现)场景描述遇到问题解决问题走起
- ASP.NET SignalR 2.0入门指南介绍SignalRSignalR和WebSocket传输和回滚HTML5 传输协议Comet transports传输协议选择过程监测传输指定传输协议连接
- ASP.NET5之客户端开发:Grunt和Gulp构建工具在Visual Studio 2015中的高效的应用Grunt和Gulp使用Grunt准备项目配置NPM配置Grunt集成起来监测文件变化与V
- 有趣的算法(三)——Hash算法
- JavaScript中的数据类型
- Logistic回归算法及Python实现
- <script>元素在XHTML中的用法
- 有趣的算法(四)——一致性Hash算法模拟redis集群
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- centos6.5下安装zabbix2.4的教程图解
- php经典趣味算法实例代码
- centos7 设置grub密码及单用户登录实例代码
- php面向对象基础详解【星际争霸游戏案例】
- Linux系统下Nginx支持ipv6配置的办法
- Smarty模板变量与调节器实例详解
- Linux中搭建完整的samba服务器全攻略(centos版)
- Thinkphp5 自定义上传文件名的实现方法
- PHP读取文件,解决中文乱码UTF-8的方法分析
- Linux低电量自动关机的实现办法
- php设计模式之工厂方法模式分析【星际争霸游戏案例】
- PHP+Apache实现二级域名之间共享cookie的方法
- linux虚拟机配置静态IP地址的完整步骤
- laravel-admin利用ModelTree实现对分类信息的管理
- Linux系统下快速配置HugePages的完整步骤