最近经常有小伙伴问我,遇到了线上问题要如何快速排查。
这非常考验工作经验了。
有些问题你以前遇到,如果再遇到类似的问题,就能很快排查出导致问题的原因。
但如果某个问题你是第一次遇到,心中可能会有点无从下手的感觉。
这篇文章总结了,我之前遇到过的一些线上问题排查思路,希望对你会有所帮助。
1 OOM问题
OOM问题在生产环境中,一旦出现,一般会是非常严重的问题,服务可能会挂掉。
但是OOM问题有多种情况,不同的情况,出现问题的原因不一样。
1.1 堆内存OOM
服务器的日志一般会打印下面的内容:
java.lang.OutOfMemoryError: Java heap space
这种是出现最多的OOM问题。
在Java服务启动时,可以增加下面的参数:
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heapdump.hprof
在发生OOM时,程序会自动把当时的内存使用情况,dump保存到指定的文件。
然后使用MAT(Memory Analyzer Tool),或者使用JDK自带的 Java visualvm,来分析dump 文件,找出导致OOM 的代码 。
1.2 栈内存OOM
出现栈内存OOM问题的异常信息如下:
java.lang.OutOfMemoryError: unable to create new native thread
如果实际工作中,出现这个问题,一般是由于创建的线程太多,或者设置的单个线程占用内存空间太大导致的。
这个时候需要排查服务的线程数量。
推荐使用线程池,可以减少线程的创建,有效控制服务中的线程数量。
1.3 栈内存溢出
出现栈内存溢出问题的异常信息如下:
java.lang.StackOverflowError
该问题一般是由于业务代码中写的一些递归调用,递归的深度超过了JVM允许的最大深度,可能会出现栈内存溢出问题。
如果生产环境中,出现了这个问题,可以排查一下递归调用是否正常,有可能出现了无限递归的情况。

最低0.47元/天 解锁文章
2694

被折叠的 条评论
为什么被折叠?



