记一次 .NET某数字化协同管理系统 内存暴涨分析
内容提要
一位朋友在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的内存。