Amazon Corretto 8 JVM挂起15-20秒问题排查求助
针对JVM突发15-20秒挂起的排查建议
既然你已经排除了GC异常、硬件/OS故障、堆转储干扰、外部jstack请求这些常见问题,那咱们得往更隐蔽的方向挖——下面这些排查步骤和日志配置,应该能帮你在下次问题复现时抓住根因:
一、拉满JVM诊断日志,捕捉内部细节
- 锁竞争追踪:给JVM加参数
-XX:+PrintLocks(Corretto 8完全支持),这个参数会记录线程获取、释放锁的全量细节,能帮你排查是不是有长时间的锁等待(哪怕不是死锁,也可能因为锁争抢导致整个JVM僵住)。 - VM内部事件日志:加上
-XX:+LogVMOutput -XX:LogFile=/opt/app/logs/vm_internal.log,这个日志会记录JVM底层的各种操作——线程创建销毁、JNI调用、类加载啥的,挂起期间的异常操作大概率会在这里留下痕迹。 - 系统调用跟踪:用
strace盯着Java进程,执行命令strace -tt -p <你的Java进程PID> -o /opt/app/logs/strace.log,挂起期间如果系统调用停滞(比如卡在磁盘读写、网络调用),日志里会一目了然。
二、排查JNI和本地代码的锅
Corretto 8本身没问题,但如果你的应用调用了JNI或者第三方本地库(比如某些老数据库驱动、加密库),这些本地代码的阻塞不会被GC日志捕捉,还能直接把整个JVM拖垮:
- 给JNI调用加日志:如果应用自己写了JNI代码,一定要在调用前后加时间戳日志,看看是不是某段本地代码执行超时了。
- JNI调用全量追踪:加JVM参数
-XX:+TraceJNICalls,会把所有JNI调用的细节都打出来,能快速定位是不是本地代码搞的鬼。
三、揪出瞬时的系统资源瓶颈
你说系统负载平均值正常,但瞬时的资源峰值(比如磁盘IO突然打满、网络断连、CPU被其他进程抢了)也可能导致JVM挂起:
- 磁盘IO实时监控:挂起时立刻跑
iostat -x 1,看%util是不是接近100%,await值是不是突然飙升——要是这样,就是磁盘IO拖了后腿。 - 网络状态排查:用
netstat -s或者ss看看有没有大量TCP重传、连接超时,或者你应用依赖的外部服务是不是在那段时间响应慢了。 - CPU调度跟踪:用
pidstat -p <PID> 1盯着Java进程的CPU使用率,要是挂起期间CPU使用率直接掉到0,说明进程被系统调度挂起,或者卡在了某个等待操作上。
四、排查JVM内部的特殊机制
- 类加载验证:如果应用有动态加载类的场景,加
-XX:+TraceClassLoading -XX:+TraceClassUnloading日志,看看是不是挂起期间有大量类加载拖慢了速度。 - JIT编译排查:虽然JIT编译一般不会导致15-20秒的停顿,但保险起见加
-XX:+PrintCompilation日志,确认挂起期间是不是有大规模的JIT编译在运行。
五、下次挂起时的应急操作
别等挂起结束再排查,一旦发现JVM僵住,立刻执行这几个操作:
- 手动抓线程快照:跑
jstack <PID> > thread_dump_<时间戳>.log,如果能生成,看看是不是一堆线程卡在同一个锁或者IO上;如果jstack也卡住了,说明进程已经没法响应系统信号,大概率是内核级问题或者本地代码阻塞。 - 抓进程状态快照:用
ps -eLf <PID>看线程状态,或者pstack <PID>(系统支持的话)获取线程栈信息,这些都是定位问题的关键证据。
内容的提问来源于stack exchange,提问作者Tuhin Dey
相关产品推荐
相关产品推荐

