目录
- 常见由JVM导致的线上问题
- GC日志解析
- 排查问题思路
- JVM参数设置
参考:
常见由JVM导致的线上问题
- OOM问题。导致OOM可能有很多原因(线程数太多、打开太多文件、内存不足)。其中内存不足这种是最常见的 OOM,一般都是由于Java 堆内存不足导致。
- 持续Full GC。
- 突然间大量接口超时告警,且cpu使率飙升,网络磁盘抖动大,内存使用率飙升
GC日志解析
- Young GC日志
- Full GC日志
GC日志中可能看见的GC原因
Last ditch collection
当JVM无法为应该存储在元空间中的东西分配内存时,它首先运行GC。它将导致“元数据GC阈值”GC。如果这个GC不能释放空间,那么尝试扩展元空间。如果仍然无法创建空闲空间,则GC将以“Last ditch collection”为由触发。如果仍然没有足够的空闲空间,则抛出OutOfMemoryError。
Metadata GC Threshold
这种类型的GC事件在以下两种情况下触发:
- 配置的元空间大小小于实际需求
- 存在类加载器泄漏 (非常不可能,但有可能)
Concurrent Mode Failure
CMS收集器使用一个或多个垃圾收集器线程,这些线程与应用程序线程同时运行,目标是在旧代变得满之前完成对它的收集。CMS收集器在应用程序线程仍然运行的情况下执行大部分跟踪和清理工作,因此应用程序线程只能看到短暂的暂停。但是,如果CMS收集器无法在老一代填满之前完成回收不可达对象,或者如果分配不能满足于老一代中的可用空闲空间块,那么应用程序将暂停并完成收集。不能同时完成收集被称为并发模式失败,这表明需要调整CMS收集器参数。并发模式失败通常触发Full GC。
排查问题思路
- 查看系统当前整体状况。系统流量情况、CPU、MEM,然后查看JVM情况、GC情况等。
- 登录服务器查找 cpu 占用率高的进程,使用
top
命令。 - 找到进程中占用 cpu 最多的线程,使用
top -Hp pid
命令。 - dump并分析JVM内存情况,结合GC日志进行排查。