Windows 运行时中的内存管理

Posted

技术标签:

【中文标题】Windows 运行时中的内存管理【英文标题】:Memory management in Windows Runtime 【发布时间】:2012-09-01 14:32:41 【问题描述】:

正如我在面向 .NET 开发人员的 Windows 8 会议中看到的,.NET 处理平台的本机对象。这些对象支持指针计数器。我很清楚,托管堆中存在托管对象和非托管对象,我们必须在 finalize 和 dispose 方法中释放它们。至于现在我不清楚我应该如何处理 。当我不得不担心托管/非托管资源时,您能给我一个建议吗?以及如何在 Windows 运行时中进行内存管理以防止我的应用程序资源泄漏?

更新:

我的意思是 .NET Metro Profile

【问题讨论】:

【参考方案1】:

底层 WinRT 接口是基于 COM 的。每个 WinRT 接口都派生自 IUnknown,其 AddRef 和 Release 方法实现基于引用计数的内存管理。

然而,这隐藏得非常好,当您编写 WinRT 应用程序时,您会使用语言投影。对于 .NET 和 javascript 应用程序,语言投影分别内置于 CLR 和 Chakra 引擎中。其中完全隐藏了实现细节,WinRT 接口映射到本地语言结构。包括巧妙地制造 COM 支持泛型和实现继承的错觉。一个有点合理的猜测是 CLR 投影使用 CLR 中已经内置的 COM 互操作支持,但不可能轻松地对其进行逆向工程。如果这完全正确,那么终结器可能会进行 IUnknown::Release() 调用。

现在很难获得关于低级细节的体面信息,微软博主和 SO 海报不说话,源代码不可用,涉及该主题的问题正在关闭,如 this one .

从陈对这个问题的评论中可以看出,你不应该对此感到好奇。如果您担心,请考虑使用 C++/CX 进行编程。这可以很好地隐藏胶水。或带有 WRL 库的本机 C++,但没有。内存管理是明确的两个运行时环境。 Microsoft 投入了大量资源,让 C++ 编程再次相关。

【讨论】:

非常感谢您的回答。据我所知,C# 是专为 .NET 设计的。那么地铁呢?这是否意味着如果我开始开发我的第一个 Metro 应用程序我最好选择 C++ 或者我不应该关心预测? Windows 运行时是否存在任何已知的内存泄漏? 我已经阅读了上面提到的线程并且没有得到关于最佳投影的强烈意见。似乎他们都有优点和缺点。 WinRT 编程的一个重要方面(在开发周期的相当后期出现)是许多 winrt 对象现在支持 ICloseable,它作为 IDisposable 投射到 C# 应用程序。这允许 .Net 和 JS 应用程序实现确定性终结。

以上是关于Windows 运行时中的内存管理的主要内容,如果未能解决你的问题,请参考以下文章

Windows内存管理

win7任务管理器 内存相关项目的解释

Windows内存管理的方式

Windows内存管理简介:

如何使用Windows内存诊断工具发现内存问题

C++应用程序性能优化——操作系统的内存管理