记一次 .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文件,可能与动态生成代码逻辑有关。

延伸问答

在Linux上运行的.NET程序出现内存泄露的原因是什么?

内存泄露的原因可能是未执行mmap导致资源未释放。

如何观察Linux上.NET程序的内存分布情况?

可以使用!maddress命令观察内存分布情况,替代Windows上的!address命令。

什么是doublemapper__deleted_?

doublemapper__deleted_与coreclr中的CreateDoubleMemoryMapper函数有关,表示资源释放时只执行了close(fd)而未执行mmap。

如何解决.NET程序的内存泄露问题?

可以通过关闭EnableWriteXorExecute选项来解决内存泄露问题。

EnableWriteXorExecute选项在.NET7中的默认设置是什么?

EnableWriteXorExecute特性在.NET7后默认开启,可能导致兼容性问题。

内存暴涨的情况下,Image占用了多少内存?

在内存暴涨的情况下,Image占用了大约3.8GB的内存。

➡️

继续阅读