Troubleshooting系列-DUBBO中间版本导致应用频繁Fullgc的问题定位分析

💡 原文中文,约2400字,阅读约需6分钟。
📝

内容提要

一台机器频繁fullgc,每分钟一次。通过分析发现dubbo的NettyChannel存在内存泄露问题,怀疑是dubbo版本不兼容或老版本有问题。先重启应用,减少堆中NettyChannel占用。源码分析发现NettyPortUnificationServerHandler没有处理channelInactive或exceptionCaught,已有修复merge。应用中间件升级版本需要保持一致,避免已知问题。

🎯

关键要点

  • 运维同学发现一台机器频繁fullgc,几乎每分钟一次。
  • 通过heap dump分析,发现dubbo的NettyChannel存在内存泄露问题。
  • 怀疑是dubbo版本不兼容或老版本有问题,应用版本为dubbo 3.1.1。
  • 临时解决方案是重启应用,减少堆中NettyChannel占用。
  • 源码分析显示NettyChannel的CHANNEL_MAP可能导致内存泄露,未处理channelInactive或exceptionCaught。
  • 在GitHub上发现类似问题,已有修复merge,主要改动是重写channelInactive以移除NettyChannel。
  • 总结:后台应用中间件版本需保持一致,及时升级以避免已知问题。

延伸问答

为什么我的机器频繁出现fullgc?

机器频繁fullgc可能是由于dubbo的NettyChannel存在内存泄露问题,尤其是在使用老版本dubbo时。

如何临时解决频繁fullgc的问题?

可以通过重启应用来临时解决频繁fullgc的问题,减少堆中NettyChannel的占用。

dubbo版本不兼容会导致什么问题?

dubbo版本不兼容可能导致内存泄露等问题,从而引发频繁的fullgc现象。

如何分析内存泄露问题?

可以通过heap dump分析和使用MAT工具来定位内存泄露问题。

NettyChannel的内存泄露是如何发生的?

NettyChannel的内存泄露可能是由于未处理channelInactive或exceptionCaught,导致CHANNEL_MAP中的引用未被清除。

如何避免应用中间件的已知问题?

保持应用中间件版本一致,并及时升级到最新版本,以避免已知问题的出现。

➡️

继续阅读