记一次 .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的内存。
➡️