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)

一般在线系统不要这么干。

缺点和方法:

  1. jmap执行期间会对进程产生很大影响,甚至卡顿。
  2. 线上是不能执行jmap。
  3. 设定参数HeapDump ,OOM的时候会自动产生堆文件。
  4. 面试最佳答案:我们很多服务器备份,停掉这台服务器,然后将这台服务器隔离开。然后用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(内存溢出)问题排查——亲测相关推荐

  1. 马士兵JVM课程笔记

    马士兵JVM课程笔记 GC和GC Tuning GC的基础知识 1.什么是垃圾 C语言申请内存:malloc free C++: new delete c/C++ 手动回收内存 Java: new ? ...

  2. 线上服务器内存分析及问题排查

    转载自  线上服务器内存分析及问题排查 平常的工作中,在衡量服务器的性能时,经常会涉及到几个指标,load.cpu.mem.qps.rt等.每个指标都有其独特的意义,很多时候在线上出现问题时,往往会伴 ...

  3. Java线上CPU内存冲高问题排查步骤

    1 引言 作为一名从事Java开发快一年的程序员,在线上经常碰到某个模块的Pod发出CPU与内存告警的问题,而这些问题会导致系统响应缓慢甚至是服务不可用.一般情况下可以通过重启或者调高Pod的资源量或 ...

  4. 服务器性能指标(二)-- 线上服务器内存分析及问题排查

    服务器性能指标(二)-- 线上服务器内存分析及问题排查 平常的工作中,在衡量服务器的性能时,经常会涉及到几个指标,load.cpu.mem.qps.rt等.每个指标都有其独特的意义,很多时候在线上出现 ...

  5. 内存地址 哪个程序_记一次排查线上程序内存的忽高忽低,又是大集合惹祸了...

    一:背景 1. 讲故事 昨天继续还技术债,优化一轮后的程序拉到线上后内存继续忽高忽低,低的时候20G,高的时候30G,过了一会又下降了几个G,毫无疑问,程序中有什么集合或者什么操作占用了大量内存,所以 ...

  6. 记一次排查线上程序内存的忽高忽低,又是大集合惹祸了

    一:背景 1. 讲故事 昨天继续还技术债,优化一轮后的程序拉到线上后内存继续忽高忽低,低的时候20G,高的时候30G,过了一会又下降了几个G,毫无疑问,程序中有什么集合或者什么操作占用了大量内存,所以 ...

  7. 线上服务器内存飙升怎么排查?

    一.线上服务器内存飙升怎么排查? 1.通过top命令查看cpu.内存占用情况 2.通过shift+m命令按内存占用排序查看哪个java进程占用内存高,获取pid 3.通过jmap -histo pid ...

  8. Probe:Android线上OOM问题定位组件

    配送骑手端App是骑手用于完成配送履约的应用,帮助骑手完成接单.到店.取货及送达,提供各种不同的运力服务,也是整个外卖闭环中的重要节点.由于配送业务的特性,骑手App对于应用稳定性的要求非常高,体现A ...

  9. 频繁gc是什么意思_一次性搞清楚线上CPU100%,频繁FullGC排查套路

    原标题:一次性搞清楚线上CPU100%,频繁FullGC排查套路 " 处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及 Full GC 次数过多的问题. 当然,这些 ...

最新文章

  1. bellman_ford寻找平均权值最小的回路
  2. 多个SSH key对应多个Host: Github, Bitbucket
  3. Java中对象的实例化顺序
  4. docker——kafka-manager安装
  5. 三阶矩阵的lu分解详细步骤_快速入门矩阵运算——开源库Eigen
  6. 常用的Opencv函数汇总(持续更新...)
  7. layer弹出层闪退_jQuery使用Layer弹出层插件闪退问题
  8. 去重查询_花生AI论文去重V1.5更新永久免费
  9. java对话框进度条_java进度条
  10. 七天学完Vue之第一天学习笔记(Vue的介绍,时间修饰符以及常用指令)
  11. 怎么生成永久二维码?怎么做出长期有效的图片二维码?
  12. 算法竞赛入门经典(第二版)第三章习题
  13. 完美实现Ubuntu系统迁移到另一台电脑/服务器
  14. gts250 linux驱动下载,下载:NVIDIA显卡Linux驱动190.32测试版
  15. 打算的亲爱额请问请问额
  16. 煤矿井下定位设备技术要求及构成
  17. 情人节,送女友一桶代码可否?
  18. 服务器是由哪些硬件构成的?带你一探究竟!
  19. SF21 | 利用PSY指标,我们来开发一个短线模型?
  20. java注解注入空,Spring4.3.7注解 @Autowired java.lang.NullPointerException

热门文章

  1. 广告买量支付方式 cpa cpc cps cpt
  2. 线上直播丨植物收样手册免费送?速来直播间!
  3. dnsmasq实现dns劫持
  4. 蚂蚁金服暂缓上市,程序IT圈炸了
  5. Java线程共享变量
  6. 微信小程序中根据字母选择城市
  7. Java顺序结构之数学函数
  8. dubbo服务注册ip地址不正确,rpc服务调用失败?
  9. 理论力学静力学与运动学补充(二):点的复合运动
  10. SAP 系统中成本中心调整