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,查看线程栈(也称为调用栈是一个记录程序运行过程中函数调用序列的数据结构。每个线程都拥有一个私有的线程栈,用于存储方法的调用帧)