马士兵—JVM—内存溢出—1.线上OOM(内存溢出)问题排查——亲测
1. 模拟线上oom问题
1.1 代码
@GetMapping("/addList")public void addList(){List list = new ArrayList();while (true){String a = "aaaaa"+new Date();list.add(a);System.out.println(a);}}
2. 线上环境启动,并配置打印gc日志
启动脚本
设置内存小一点 都为20m。
java -Xms20m -Xmx20m -Xloggc:./gc.log -jar test.jar >> test.log 2>&1 &
3. 调用死循环代码
3.1 控制台报错日志
3.2 gc日志
可以看到全是full gc
4. 问题排查方法
4.1 TOP命令查看cpu
此时的cpu已经飙升到了80%多了
4.1 jps
查看当前的java程序信息,前面是进程号。
如果显示的是jar。没有显示项目的名称,是因为启动的时候没事使用包的绝对路径。自己改一下。
4.2 jinfo -进程号
5. JConsule链接远程服务器
5.1 启动脚本可以使用如下的。不然可能链接不上
注意hostname的ip地址要和本机地址一样
nohup java \
-Djava.rmi.server.hostname=192.168.17.129 \
-Dcom.sun.management.jmxremote=true \
-Dcom.sun.management.jmxremote.port=1099 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-XX:+PrintGC -Xms80M -Xmx80M \
-jar test.jar > test.log 2>&1 &
5.2 登录页面
这里的端口号,和上面启动脚本的端口号保持一直,不然等不上去。
5.3 登录成功
选择不安全链接
6. jvisualvm
6.1 登录
点击文件。选择添加jmx连接。然后输入和上面jconsule一样的地址。就可以登录。
6.2 登录成功页面
可以看到一些启动参数信息。
7. 线上真实环境
首先为什么不用图形化界面。首先如果你需要实时监控。这样的话那就需要一直的启动一个程序jmxremote来一直监听这服务。所以比较消耗性能。这样是不可能的。
7.1 jmap 获取相关信息(重要)
获取内存占用情况的前二十行。
jmap -histo 8995 | head -20
可以看出占用最多的是char[]。
自动生产堆文件,当内存溢出的时候。
-XX:+UseParallelGC -XX:+HeapDumpOnOutOfMemoryError
启动脚本,在第一次oom的时候生成一个dump文件,他的后缀不是dump的。注意可能只在第一次oom的时候生成文件。
nohup java \
-Djava.rmi.server.hostname=192.168.17.129 \
-Dcom.sun.management.jmxremote=true \
-Dcom.sun.management.jmxremote.port=1099 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-XX:+UseParallelGC -XX:+HeapDumpOnOutOfMemoryError \
-Xms80M -Xmx80M \
-jar test.jar > test.log 2>&1 &
7.2 jmap的相关命令
7.2.1 查看整个JVM内存状态
jmap -heap [pid]
要注意的是在使用CMS GC 情况下,jmap -heap的执行有可能会导致JAVA 进程挂起
7.2.2 查看JVM堆中对象详细占用情况(jmap -histo)(极力推荐)在线定位问题
jmap -histo [pid]
jmap -histo [pid] | head -20 (前20行)
基本就可以定位到问题,我们可以看到是OomController这个类的,有关Person的相关问题。
7.2.3 导出整个JVM 中内存信息Dump文件(jmap -dump)
一般在线系统不要这么干。
缺点和方法:
- jmap执行期间会对进程产生很大影响,甚至卡顿。
- 线上是不能执行jmap。
- 设定参数HeapDump ,OOM的时候会自动产生堆文件。
- 面试最佳答案:我们很多服务器备份,停掉这台服务器,然后将这台服务器隔离开。然后用jmap导出,导出之后在观察,面试官就不会再有问题了。
jmap -dump:format=b,file=文件名 [pid]
jmap -dump:format=b,file=oom.dump 10922
8. 使用jvisualvm分析dump文件
在文件按钮选择转入->文件类型选择堆->选择dump文件
转入之后生产的文件。导入分析页面。
8.1 装入好多字符串oom
@GetMapping("/addList")public void addList(){List list = new ArrayList();while (true){String a = "aaaaa"+new Date();list.add(a);System.out.println(a);}}
8.2 装入好多对象错误
@GetMapping("/addPerson")public void addPerson(){List list = new ArrayList();while (true){list.add(new Person());System.out.println('p');}}
8.3 查找最大的对象(很重要)
一下就可以知道是arrayList数组太大。
面试
案例一:
发现不知道哪位同事在设置tomcat的http-header-size参数的时候设置的过大。
server.port=9898
server.max-http-header-szie=10000000
通过jmap查询对象的时候,发现一定会有http对象较大。这样比较容易定位是这个问题。
案例二(比较牛逼)
Distuptor有个可以设置链的长度,如果过大,然后对象大,消费完不主动释放,会溢出
案例三
线程池不当运用产生OOM问题
不断的往List里加对象(实在太LOW)
马士兵—JVM—内存溢出—1.线上OOM(内存溢出)问题排查——亲测相关推荐
- 马士兵JVM课程笔记
马士兵JVM课程笔记 GC和GC Tuning GC的基础知识 1.什么是垃圾 C语言申请内存:malloc free C++: new delete c/C++ 手动回收内存 Java: new ? ...
- 线上服务器内存分析及问题排查
转载自 线上服务器内存分析及问题排查 平常的工作中,在衡量服务器的性能时,经常会涉及到几个指标,load.cpu.mem.qps.rt等.每个指标都有其独特的意义,很多时候在线上出现问题时,往往会伴 ...
- Java线上CPU内存冲高问题排查步骤
1 引言 作为一名从事Java开发快一年的程序员,在线上经常碰到某个模块的Pod发出CPU与内存告警的问题,而这些问题会导致系统响应缓慢甚至是服务不可用.一般情况下可以通过重启或者调高Pod的资源量或 ...
- 服务器性能指标(二)-- 线上服务器内存分析及问题排查
服务器性能指标(二)-- 线上服务器内存分析及问题排查 平常的工作中,在衡量服务器的性能时,经常会涉及到几个指标,load.cpu.mem.qps.rt等.每个指标都有其独特的意义,很多时候在线上出现 ...
- 内存地址 哪个程序_记一次排查线上程序内存的忽高忽低,又是大集合惹祸了...
一:背景 1. 讲故事 昨天继续还技术债,优化一轮后的程序拉到线上后内存继续忽高忽低,低的时候20G,高的时候30G,过了一会又下降了几个G,毫无疑问,程序中有什么集合或者什么操作占用了大量内存,所以 ...
- 记一次排查线上程序内存的忽高忽低,又是大集合惹祸了
一:背景 1. 讲故事 昨天继续还技术债,优化一轮后的程序拉到线上后内存继续忽高忽低,低的时候20G,高的时候30G,过了一会又下降了几个G,毫无疑问,程序中有什么集合或者什么操作占用了大量内存,所以 ...
- 线上服务器内存飙升怎么排查?
一.线上服务器内存飙升怎么排查? 1.通过top命令查看cpu.内存占用情况 2.通过shift+m命令按内存占用排序查看哪个java进程占用内存高,获取pid 3.通过jmap -histo pid ...
- Probe:Android线上OOM问题定位组件
配送骑手端App是骑手用于完成配送履约的应用,帮助骑手完成接单.到店.取货及送达,提供各种不同的运力服务,也是整个外卖闭环中的重要节点.由于配送业务的特性,骑手App对于应用稳定性的要求非常高,体现A ...
- 频繁gc是什么意思_一次性搞清楚线上CPU100%,频繁FullGC排查套路
原标题:一次性搞清楚线上CPU100%,频繁FullGC排查套路 " 处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及 Full GC 次数过多的问题. 当然,这些 ...
最新文章
- bellman_ford寻找平均权值最小的回路
- 多个SSH key对应多个Host: Github, Bitbucket
- Java中对象的实例化顺序
- docker——kafka-manager安装
- 三阶矩阵的lu分解详细步骤_快速入门矩阵运算——开源库Eigen
- 常用的Opencv函数汇总(持续更新...)
- layer弹出层闪退_jQuery使用Layer弹出层插件闪退问题
- 去重查询_花生AI论文去重V1.5更新永久免费
- java对话框进度条_java进度条
- 七天学完Vue之第一天学习笔记(Vue的介绍,时间修饰符以及常用指令)
- 怎么生成永久二维码?怎么做出长期有效的图片二维码?
- 算法竞赛入门经典(第二版)第三章习题
- 完美实现Ubuntu系统迁移到另一台电脑/服务器
- gts250 linux驱动下载,下载:NVIDIA显卡Linux驱动190.32测试版
- 打算的亲爱额请问请问额
- 煤矿井下定位设备技术要求及构成
- 情人节,送女友一桶代码可否?
- 服务器是由哪些硬件构成的?带你一探究竟!
- SF21 | 利用PSY指标,我们来开发一个短线模型?
- java注解注入空,Spring4.3.7注解 @Autowired java.lang.NullPointerException