1.OOM 原因
- java.lang.OutOfMemoryError: Java heap space 堆空间不够,请申请更多内存
- java.lang.OutOfMemoryError: PermGen space及其解决方法, 永久带不够,存放类的字节码和常量池
- java.lang.OutOfMemoryError: unable to create new native thread, 能创建的线程数量是有限的
- java.lang.OutOfMemoryError:GC overhead limit exceeded,并行或并发的GC回收时间过长
2.OOM 可能的原因
java.lang.StackOverflowError … 递归或者方法调用层次太多,线程栈满了
java.net.SocketException: Too many open files 系统对使用的文件句柄是有限制的,超过了这个限制
OOM Killer https://mp.weixin.qq.com/s/34GVlaYDOdY1OQ9eZs-iXg
3.一个监控 OOM 现场版脚本
#!/bin/bash
ps -Leo pid,lwp,user,pcpu,pmem,cmd >> /tmp/pthreads.logecho "ps -Leo pid,lwp,user,pcpu,pmem,cmd >> /tmp/pthreads.log" >> /tmp/pthreads.logecho `date` >> /tmp/pthreads.logecho 1pid=`ps aux|grep tomcat|grep cwh|awk -F ' ' '{print $2}'`echo 2echo "pstack $pid >> /tmp/pstack.log" >> /tmp/pstack.log
pstack $pid >> /tmp/pstack.logecho `date` >> /tmp/pstack.logecho 3echo "lsof >> /tmp/sys-o-files.log" >> /tmp/sys-o-files.log
lsof >> /tmp/sys-o-files.logecho `date` >> /tmp/sys-o-files.logecho 4echo "lsof -p $pid >> /tmp/service-o-files.log" >> /tmp/service-o-files.log
lsof -p $pid >> /tmp/service-o-files.logecho `date` >> /tmp/service-o-files.logecho 5echo "jstack -l $pid >> /tmp/js.log" >> /tmp/js.log
jstack -l -F $pid >> /tmp/js.logecho `date` >> /tmp/js.logecho 6 echo "free -m >> /tmp/free.log" >> /tmp/free.log
free -m >> /tmp/free.logecho `date` >> /tmp/free.logecho 7echo "vmstat 2 1 >> /tmp/vm.log" >> /tmp/vm.log
vmstat 2 1 >> /tmp/vm.logecho `date` >> /tmp/vm.logecho 8echo "jmap -dump:format=b,file=/tmp/heap.hprof 2743" >> /tmp/jmap.log
参考:
1.JVM类加载机制
2.JVM内存结构
3.GC算法
4.JVM调优–命令
7.JVM调优–工具
8.JVM知识点总览
10.OOM Killer
文档信息
- 本文作者:jiushun.cheng
- 本文链接:https://minipa.github.io/2016/07/15/jvm-oom/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)