我目前正在使用Windows Phone 8.我正面临一些与内存相关的问题。
我有两个PhoneApplicationPages。这两个页面都包含图像,文本块等。假设当我在第1页时我的应用程序使用30MB内存。如果我从第1页导航到第2页,则已用内存量增加到35MB。然后当我回到第1页时,用过的内存仍然是35MB。
为什么内存或缓存没有自动释放?有没有办法手动清除内存或缓存?
(p.s:表示页面的两个类都是静态的,我在 OnNavigatedFrom 方法中将它们设置为null。)
答案 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.
}
}