在Windows Phone 8中,内存不会自动释放。

4
我目前在使用Windows Phone 8进行开发,遇到了一些与内存有关的问题。
假设我有两个PhoneApplicationPages。这两个页面都包含图像、文本块等元素。当我在page-1页面时,我的应用程序使用了30MB的内存。如果我从page-1导航到page-2,使用的内存量增加到35MB。然后当我返回到page-1时,使用的内存仍然是35MB。
为什么内存或缓存不会自动释放?有没有办法手动清除内存或缓存?
(附注:表示页面的两个类都是静态的,并且我在OnNavigatedFrom方法中将它们设置为null。)
2个回答

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();
            });
        });
    });
}

请注意,即使您不使用此代码,您的内存最终也将被释放(通常在大约三次页面导航后)。但是,提前释放内存对于内存密集型应用程序确实很有帮助。


3
从这个链接中得知:链接
.NET的垃圾回收器(GC)完全免除了开发人员跟踪内存使用情况和知道何时释放内存的负担。Microsoft .NET CLR(Common Language Runtime)要求所有资源都从托管堆分配。您不需要从托管堆中释放对象-当应用程序不再需要它们时,对象会自动释放。
内存并非无限制的。垃圾回收器必须进行收集以释放一些内存。垃圾回收器的优化引擎根据所做的分配来确定执行收集的最佳时间(确切的标准由Microsoft保护)。
基本上,垃圾回收器从系统中释放内存,但由于性能消耗过大,它并不总是处于活动状态。您可以通过调用GC.Collect();方法来强制执行GC,如此解释所述。
现在,强制执行垃圾回收器并不是一个好主意,但您可以使用类析构函数帮助它,如此处所述。
class YourClass
{
    ~YourClass()  // destructor
    {
        // cleanup statements.
    }
}

1
析构函数有什么作用? - lisp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接