一次性搞清楚线上CPU100%,频繁FullGC排查套路
②等待一段时间之后,比如 10s,再次对 jstack 日志进行 grep,将其导出到另一个文件,如 a2.log,结果如下所示:
③重复步骤 2,待导出 3~4 个文件之后,我们对导出的文件进行对比,找出其中在这几个文件中一直都存在的用户线程。 这个线程基本上就可以确认是包含了处于等待状态有问题的线程。因为正常的请求线程是不会在 20~30s 之后还是处于等待状态的。 ④经过排查得到这些线程之后,我们可以继续对其堆栈信息进行排查,如果该线程本身就应该处于等待状态,比如用户创建的线程池中处于空闲状态的线程,那么这种线程的堆栈信息中是不会包含用户自定义的类的。 这些都可以排除掉,而剩下的线程基本上就可以确认是我们要找的有问题的线程。 通过其堆栈信息,我们就可以得出具体是在哪个位置的代码导致该线程处于等待状态了。 这里需要说明的是,我们在判断是否为用户线程时,可以通过线程最前面的线程名来判断,因为一般的框架的线程命名都是非常规范的。 我们通过线程名就可以直接判断得出该线程是某些框架中的线程,这种线程基本上可以排除掉。 而剩余的,比如上面的 Thread-0,以及我们可以辨别的自定义线程名,这些都是我们需要排查的对象。 经过上面的方式进行排查之后,我们基本上就可以得出这里的 Thread-0 就是我们要找的线程,通过查看其堆栈信息,我们就可以得到具体是在哪个位置导致其处于等待状态了。 (编辑:西安站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |