1,OOM
http://www.jianshu.com/p/2fdee831ed03
处理思路:
1,使用jps -v确定是哪个线程,
2,使用jstack -pid 查询当前进程 堆栈信息.
3,使用 jmap -dump:file=dump.dump pid 下载当前dump文件;
4,使用IBM Thread and Monitor Dump Analysis For java 分析 堆栈信息,
5,使用 MAT 插件分析 dump文件.
OOM异常大概有四种情况:
A,java.lang.OutOfMemoryError: GC overhead limit exceeded
发生异常信息 Exception in thread "pool-1-thread-1" java.lang.OutOfMemoryError: GC overhead limit exceeded:
GC overhead limit exceeded 导致的原因主要是
大量网络读写线程处于 BLOCKED或 waiting on condition 状态.
使用jstack pid查看线程大概有这么几个状态:
1,Runnable
2, Wait on condition
该状态出现在线程等待某个条件的发生。具体是什么原因,可以结合 stacktrace来分析。最常见的情况是线程在等待网络的读写
3,Waiting for monitor entry 和 in Object.wait()
在多线程的 JAVA程序中,实现线程之间的同步,就要说说 Monitor。 Monitor是 Java中用以实现线程之间的互斥与协作的主要手段,它可以看成是对象或者 Class的锁。每一个对象都有,也仅有一个 monitor。每个 Monitor在某个时刻,只能被一个线程拥有,该线程就是 “Active Thread”,而其它线程都是 “Waiting Thread”,分别在两个队列 “ Entry Set”和 “Wait Set”里面等候。在 “Entry Set”中等待的线程状态是 “Waiting for monitor entry”,而在 “Wait Set”中等待的线程状态是 “in Object.wait()”。
先看 “Entry Set”里面的线程。我们称被 synchronized保护起来的代码段为临界区。当一个线程申请进入临界区时,它就进入了 “Entry Set”队列。对应的 code就像
synchronized(obj) {
.........
}
这时有两种可能性:
该 monitor不被其它线程拥有, Entry Set里面也没有其它等待线程。本线程即成为相应类或者对象的 Monitor的 Owner,执行临界区的代码
该 monitor被其它线程拥有,本线程在 Entry Set队列中等待。
在第一种情况下,线程将处于 “Runnable”的状态,而第二种情况下,线程 DUMP会显示处于 “waiting for monitor entry”。如下所示:
2,cpu过高.