WPF每次打开和关闭窗口都会增加内存

时间:2018-06-17 08:13:45

标签: c# wpf xaml memory heap-memory

我已经完成并且非常容易测试,只是为了理解wpf如何使用内存。 我创建了一个项目,其中一个窗口为/// <summary> /// Interaction logic for WindowTest1.xaml /// </summary> public partial class WindowTest1 : Window { public WindowTest1() { InitializeComponent(); } private void Button_Click(object sender, RoutedEventArgs e) { var wt2 = new WindowTest2(); wt2.ShowDialog(); wt2 = null; } } 。 第二个窗口完全空了。 当我按下<Window x:Class="WpfAppXtesting.WindowTest1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WpfAppXtesting" mc:Ignorable="d" Title="WindowTest1" Height="450" Width="800"> <Grid> <Button Content="Button" HorizontalAlignment="Left" Height="148" Margin="191,138,0,0" VerticalAlignment="Top" Width="267" Click="Button_Click"/> </Grid> 时,单击打开第二个窗口 窗口1后面的代码:

 /// <summary>
/// Interaction logic for WindowTest2.xaml
/// </summary>
public partial class WindowTest2 : Window
{
    public WindowTest2()
    {
        InitializeComponent();
    }
}

xaml窗口1:

<Window x:Class="WpfAppXtesting.WindowTest2"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:WpfAppXtesting"
    mc:Ignorable="d"
    Title="WindowTest2" Height="450" Width="800">
<Grid>

</Grid>

window2后面的

代码:

getContainerIpAddress()

xaml code window2:

getMappedPort(...)

在下图中,我拍摄了内存状态的屏幕截图。 我只在第一个窗口开始时的第一行。 第二个窗口打开时的第二行。 第二个窗口关闭时的第三行。 十次打开后关闭第二个窗口的最后一个列表。

为什么内存不会回到第一个列表用法?

enter image description here

1 个答案:

答案 0 :(得分:1)

首先,在关闭第二个窗口后,不要调用GC.Collect强制立即进行垃圾回收,因此您不能认为在您关闭时已经收集了窗口拍摄最后一张内存快照。

即使您明确地调用了GC.Collect,也不能假设CLR会立即释放占用的内存。在性能方面分配和释放内存并不是免费的,并且随着应用程序稍后会请求更多内存的更改,没有必要立即将内存段释放回操作系统(OS)。 / p>

.NET应用程序在托管环境中执行,CLR负责分配内存并将其释放回操作系统。如何以及何时执行此操作是您无法在应用程序中实际控制的实现细节。

这里唯一要关心的是关闭的窗口一旦关闭就应该有资格进行垃圾收集。它是。 <{1}}方法返回后,将局部变量设置为null没有任何区别。