记一次 .NET某数字化协同管理系统 内存暴涨分析

💡 原文中文,约8000字,阅读约需19分钟。
📝

内容提要

一位朋友在Linux上运行.NET程序时遇到内存泄露,发现大量内存被标记为doublemapper__deleted_。分析后得知,可能是未执行mmap导致资源未释放。关闭EnableWriteXorExecute选项后,程序恢复正常。此特性在.NET7后默认开启,可能导致兼容性问题。

🎯

关键要点

  • 一位朋友在Linux上运行.NET程序时遇到内存泄露,发现大量内存被标记为doublemapper__deleted_。
  • 内存暴涨的原因可能是未执行mmap导致资源未释放。
  • 使用!maddress命令观察内存分布情况,发现Image占用了大量内存。
  • doublemapper__deleted_与coreclr中的CreateDoubleMemoryMapper函数有关,可能是资源释放时只执行了close(fd)而未执行mmap。
  • 可以通过关闭EnableWriteXorExecute选项来解决内存泄露问题。
  • EnableWriteXorExecute特性在.NET7后默认开启,可能导致兼容性问题。
  • 通过分析内存段,发现大量内存承载了.NET的dll文件,可能与动态生成代码逻辑有关。
➡️

继续阅读