虚引用GC耗时分析优化(由 1.2 降低至 0.1 秒)

💡 原文中文,约8400字,阅读约需20分钟。
📝

内容提要

由于大量PhantomReference对象导致GC耗时增加,系统出现超时告警。通过优化数据库连接池配置和定期清理虚引用,GC停顿时间显著降低,系统恢复正常,超时告警消失。

🎯

关键要点

  • 线上应用频繁出现超时告警,主要是由于getUiToken接口异常状态码导致的。
  • 服务器配置为Linux 4c8g,JVM参数配置包括使用G1GC和HeapDump等。
  • 通过SGM监控平台分析接口耗时,发现GC处理时间过长是主要原因。
  • GC日志显示PhantomReference对象数量过多,导致GC停顿时间增加。
  • PhantomReference是最弱的引用关系,主要用于对象被回收时的通知。
  • 通过内存分析工具MAT发现有4340个虚引用对象,主要是ConnectionPhantomReference。
  • 数据库连接池的默认配置导致频繁创建新连接,增加了PhantomReference数量。
  • 优化方案包括调整连接池配置和增加连接存活时间,减少新连接生成。
  • 开启ref-proc并行处理以提高GC效率。
  • 定时清理虚引用列表数据或升级mysql-connector-java版本作为解决方案。
  • 优化后GC停顿时间显著降低,系统恢复正常,超时告警消失。
➡️

继续阅读