Windows Phone 8中没有自动释放内存

时间:2014-11-05 11:08:32

标签: c# xaml windows-phone-8

我目前正在使用Windows Phone 8.我正面临一些与内存相关的问题。

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

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

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

2 个答案:

答案 0 :(得分:4)

由于某些我不知道的原因,即使页面已从后台堆栈中删除,运行时也会暂时保留对页面的引用。我在这里记录了我对此行为的调查结果: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();
            });
        });
    });
}

请注意,它并不是真正的泄漏,即使您不使用此代码,您的记忆最终也会被释放(通常在大约三页导航后)。但是,更早地释放内存对于内存密集型应用程序非常有帮助。

答案 1 :(得分:3)

从此link

  

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

     

微软? .NET CLR(公共语言Runti me)需要所有   资源从托管堆中分配。你从不释放物品   来自托管堆对象,当它们为no时自动释放   申请需要更长时间。

     

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

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

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

现在,强制垃圾收集器执行并不是一个好主意,但你可以使用class destructor来帮助它:

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