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的使用的时候需要注意。有可能会导致服务停止!!
- C语言第七讲,函数入门.
- 【全网扫描】获取CDN背后网站的真实IP
- C语言第六讲,数组
- C语言第五讲,语句 顺序循环选择.
- C语言第四讲,typedef 关键字,以及作用域
- C语言第三讲,基本数据类型
- 64位内核第二讲,进程保护之对象钩子
- x64内核HOOK技术之拦截进程.拦截线程.拦截模块
- Spring开启方法异步执行
- 64位内核第一讲,和32位内核的区别
- Maven精选系列--发布jar包到Nexus私库
- 《SpringMVC从入门到放肆》五、SpringMVC配置式开发(处理器适配器)
- 《SpringMVC从入门到放肆》四、SpringMVC配置式开发(处理器映射器)
- 什么是Spring Boot?
- 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 文档注释
- python实现斗地主分牌洗牌
- Python Mock模块原理及使用方法详解
- python实现猜数游戏(保存游戏记录)
- PHP实现简单计算器小程序
- PHP单例模式模拟Java Bean实现方法示例
- php实现每日签到功能
- laravel5实现微信第三方登录功能
- Laravel框架定时任务2种实现方式示例
- tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this T
- Python 基于jwt实现认证机制流程解析
- Keras – GPU ID 和显存占用设定步骤
- PHP中如何使用Redis接管文件存储Session详解
- 看我一波,Android获取进程名函数,代码优化到极致的操作!
- laravel5使用freetds连接sql server的方法
- opencv 图像滤波(均值,方框,高斯,中值)