OOM问题总结

OOM问题总结

1.一次性申请太多

问题:代码出现死循环、一次性分配过大的内存空间、存在大量临时对象
优化:对于临时对象可以使用对象池或缓存

2.内存资源耗尽未释放

问题:流等资源没有释放,静态资源设置过多,图片、音频、视频等大型资源的加载和释放
解决:使用try-with-resources(是tey-catch-finally的语法糖写法,更加优雅)语句或手动释放资源,同时要注意在使用缓存和静态资源时避免过度占用内存

3.本身资源不够

问题:堆、线程池太小,数据库连接数太少不够日常业务正常使用
查看方法:使用jmap查看堆信息,对堆进行相应调整
jmap -heap 进程号

如何定位oom问题

1.项目如果挂了

解决:只能提前设置Dump文件:
-xx:+HeapDumpOnOutOfMemoryError表示在内存溢出时自动生成Heap Dump文件
-xx:HeapDumpPath=表示设置生成的Heap Dump文件保存的路径。

2.项目如果没有没挂

解决:jmap -dump:format=b,file=文件路径(注意文件后缀使用.hprof) 端口号或者使用Arthas工具
弊端:会造成一次gc,所有线程会中断,产生stop the world

如何查看java进程?
jps

如何查看Dump文件?
使用jvisualvm工具,使用时查看跟业务有关的对象,找到GCRoot,查看线程栈(也称为调用栈是一个记录程序运行过程中函数调用序列的数据结构。每个线程都拥有一个私有的线程栈,用于存储方法的调用帧)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值