我有一个UWP Windows 10应用程序,并注意到任务管理器中的内存使用量会随着时间的推移而增加。
我简化了这个应用程序并发现在导航页面时内存会增加。因此,我制作了一个只包含几个页面的简单应用程序进行测试,但是在这个简单的应用程序中内存仍然在增加。我有一个主页面,它会定时从Page1导航到Page2并返回至MainPage。
public sealed partial class MainPage : Page
{
private DispatcherTimer _timer;
private bool _page1Showing;
private bool _timerRunning;
public MainPage()
{
this.InitializeComponent();
_timer = new DispatcherTimer();
_timer.Interval = new TimeSpan(0, 0, 0, 0, 200);
_timer.Tick += _timer_Tick;
}
private void _timer_Tick(object sender, object e)
{
GC.Collect();
this.rootFrame.BackStack.Clear();
this.rootFrame.ForwardStack.Clear();
if (_page1Showing)
{
this.rootFrame.Navigate(typeof(Page2));
_page1Showing = false;
}
else
{
this.rootFrame.Navigate(typeof(Page1));
_page1Showing = true;
}
}
private void Button_Click(object sender, RoutedEventArgs e)
{
if (_timerRunning)
{
_timer.Stop();
_timerRunning = false;
}
else
{
_timer.Start();
_timerRunning = true;
}
}
}
页面1和页面2是空白页面,有背景颜色的网格以便查看导航。当此应用程序运行时,在任务管理器中的内存使用量每30分钟增加约1MB。
我使用VS2015中的内存诊断工具运行了该应用程序,托管堆与预期相同:
堆始终在增加:
比较堆的快照显示:
我不明白这些McgInterop对象是什么?为什么这样一个简单的应用程序内存使用量总是在增加。我的主要应用程序需要长时间运行(几个月或以上)。感谢任何帮助。
我尝试更改页面NavigationCacheMode属性,如果设置为Required,则页面只会创建一次。如果设置为disabled,则页面每次都会创建,并且我检查了期望的终结器被调用。
--
编辑:我添加了一个按钮来启动和停止计时器(已更新上述内容)。似乎当计时器在运行时,任务管理器中的内存使用量会增加,当计时器停止时,内存使用量最终会下降。
我在一天内测量了任务管理器中的内存使用量,每隔约2小时启动和停止计时器,如下所示,它会缓慢增加,然后在某个时刻下降:
12.5 -> 17.1 -> 16.7 -> 13.9 -> 16.8 -> 22.5 -> 13.6 -> 14.6 -> 24.9 -> 15.2
所以我猜一切都正常?但我不清楚这里发生了什么,为什么会增加这么多?在什么条件下会被释放?
系统是否延迟释放内存,而页面正在导航时?当用户通常与屏幕交互时?
GC.Collect();
,系统会为你调用。我的演示已经运行了将近2个小时,内存并没有持续增加,但有些变化。 <br> 这是关于Visual Studio中Memory Tool的文档链接:http://blogs.msdn.com/b/visualstudioalm/archive/2013/10/16/net-memory-analysis-enhancement - John