windows phone 8中的内存不会自动释放

本文关键字:释放 内存 phone windows | 更新日期: 2023-09-27 18:29:09

我目前在windows phone 8中工作。我正面临一些与记忆有关的问题。

让我有两个PhoneApplicationPages。两个页面都包含图像、文本块等。假设当我在第1页时,我的应用程序正在使用30MB的内存。如果我从第1页导航到第2页,则使用的内存量将增加到35MB。然后当我回到第1页时,使用的内存仍然是35MB。

为什么内存或缓存没有自动释放?有没有办法手动清除内存或缓存?

(附言:表示页面的两个类都是静态的,我在OnNavigatedFrom方法中将它们设置为null。)

windows phone 8中的内存不会自动释放

由于我不知道的一些原因,运行时会在一段时间内保留对页面的引用,即使在页面从后堆栈中删除之后也是如此。我在这里记录了我对这种行为的发现:http://blogs.codes-sources.com/kookiz/archive/2013/11/11/wpdev-give-that-memory-back.aspx

长话短说,如果你想立即回收内存,请将此代码添加到你的页面中:

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
    base.OnNavigatedTo(e);
    this.Dispatcher.BeginInvoke(() =>
    {
        GC.Collect();
        GC.WaitForPendingFinalizers();
        this.Dispatcher.BeginInvoke(() =>
        {
            GC.Collect();
            GC.WaitForPendingFinalizers();
            this.Dispatcher.BeginInvoke(() =>
            {
                GC.Collect();
                GC.WaitForPendingFinalizers();
            });
        });
    });
}

请注意,这并不是真正的泄漏,即使你不使用此代码,你的内存最终也会被释放(通常在大约三页导航之后)。但是,提前释放内存确实有助于内存密集型应用程序。

从此链接:

.NET的垃圾收集器(GC)完全免除了开发人员的责任从跟踪内存使用情况到知道何时释放内存。

微软。NET CLR(公共语言运行程序)要求从托管堆中分配资源。您从不释放对象来自托管堆的对象在为no时自动释放应用程序需要更长的时间。

记忆不是无限的。垃圾收集器必须执行收集以释放一些内存。垃圾收集器的优化引擎确定执行收集的最佳时间,(确切的标准由微软保护)基于正在进行的分配。

基本上,垃圾回收器从系统中释放内存,但它并不是一直处于活动状态,因为它会消耗性能。

您可以通过调用GC.Collect();方法来强制GC进行收集,如下所述。

现在,强制执行垃圾收集器不是一个好主意,但您可以通过使用类析构函数来帮助它:

class YourClass
{
    ~YourClass()  // destructor
    {
        // cleanup statements.
    }
}