8-JVM线上问题

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 分析 堆栈信息,

 

172543_SBrT_3613309.png

 

            

         5,使用 MAT 插件分析 dump文件.

172010_FAbc_3613309.png

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过高.

 

转载于:https://my.oschina.net/u/3613309/blog/1549351

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值