Java面试-如何处理服务器OOM

1、OOM的原因

作为一个程序员,基本或多或少的都接触过Java程序崩溃,其中因为OOM导致Java程序崩溃占大部分比例,导致OOM的原因了主要有如下的2个原因

  • 全量扫描表,这个在测试数据量有限的情况下,不容易被测试发现,容易造成缺陷逃逸;笔者就有过将生产的全量表查询到JVM内存中,导致线上环境频繁fullgc,最终导致程序不可用的。IO操作后未回收对象:文件的频繁的读写,file资源没有回收,也会造成内存溢出。

  • 业务请求过多:在实际的开发过程中,遇到过有大量会话请求到达服务器,但是查库过慢,大量的会话请求卡住,会话内容过大会导致内存溢出。

  • 虚拟机本身内存较少:Jvm在启动的时候,会设置Jvm的堆内存大小,参数为-Xms【初始内存大小】,-Xmx【最大内存大小】,如果-Xmx设置过小,那么也会造成线上OOM。

2、OOM的定位方法

OOM定位的方法可以按照Java程序是否已经崩溃,分为2种处理方案

Java程序已经崩溃

  • 如果Java程序已经崩溃,想要定位具体哪个对象有问题,则需要在Jvm启动的时候添加如下命令

java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=自定义dump目录

 添加这条命令后,就可以通过自定义dump目录找到对应的.hprof文件,然后通过VisualVM查看大对象,和线程情况。

Java程序还在运行

如果Java程序还在运行中,想要定位出现OOM的代码行数,可以先通过jps查询Java的进程,然后使用jmap命令将内存快照文件导出,然后进行分析,在使用jmap的时候,会当前实例STW,但是当服务器频繁fullgc的时候,本身应用实例的cpu负载已经很高了,服务基本在不可用的状态下。

jmap -dump:format=b,file=<heap-dump-path> <pid>

运行中的Java程序也可以安装Arthas进行监控。

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值