none
c# 调用函数后内存没有得到释放 RRS feed

  • 常规讨论

  • 用WPF随便画一个按钮,然后让点击该按钮时候执行一个简单运算,查看内存的时候,发现内存只会一路上涨而不会释放,这是为什么呢?

    public partial class MainWindow : Window
        {
            List<Point> a;
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, RoutedEventArgs e)
            {
                a = genValue();
            }
    
            private List<Point> genValue()
            {
                List<Point> result = new List<Point>();
                for (int i = 0; i < 10000; i++)
                {
                    result.Add(new Point() { X = i, Y = i * i });
                }
                return result;
            }
        }

    2012年9月5日 16:04

全部回复

  • a 在整个Window的作用域中,Window不释放,a当然是不会释放的。

    Wanpeng wanpeng.ones@gmail.com

    2012年9月6日 1:36
  • 但每次重新给a赋值的时候,前边的值内容还会存在吗?

    就算在

    a = genValue()

    前加上

    a.clear()

    依然会一直往上涨。

    不过貌似涨到某个值后就不往上加了?

    2012年9月6日 3:46
  • 使用
    GC.Collect();

    再看看内存问题,这样才会准确一些。

    Wanpeng wanpeng.ones@gmail.com

    2012年9月6日 5:22
  • 我尝试了一下GC,不过没有发现较大的改善。单纯的List而言,.net本身的垃圾回收机制应该还是发挥作用的,但如果我用WPF Toolkit Chart进行绘图,将上述的List载入到绘图里边,这个内存占用量就比较庞大了,而且就一直不释放,不停的load,最终程序会直接出错。

    <Window x:Class="LoadLine2.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:dc="clr-namespace:System.Windows.Controls.DataVisualization.Charting;assembly=System.Windows.Controls.DataVisualization.Toolkit"
            xmlns:dv="clr-namespace:System.Windows.Controls.DataVisualization;assembly=System.Windows.Controls.DataVisualization.Toolkit"
            xmlns:cp="clr-namespace:System.Windows.Controls.DataVisualization.Charting.Primitives;assembly=System.Windows.Controls.DataVisualization.Toolkit" 
            Title="MainWindow" Height="350" Width="525">
        <Window.Resources>
            <Style x:Key="MyDataPointStyle" TargetType="dc:LineDataPoint">
                <Setter Property="Background" Value="Blue"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="dc:LineDataPoint"/>
                    </Setter.Value>
                </Setter>
            </Style>
        </Window.Resources>
        <Grid>
            <dc:Chart Name="toolkitChart" Background="Transparent">
                <dc:Chart.Series>
                    <dc:LineSeries Name="LineCreate"
                                   ItemsSource="{Binding}"
                                   IndependentValueBinding="{Binding X}"
                                   DependentValueBinding="{Binding Y}"
                                   DataPointStyle="{StaticResource MyDataPointStyle}">
                    </dc:LineSeries>
                </dc:Chart.Series>
            </dc:Chart>
            <Button Content="Load" Height="27" Margin="19,13,0,0" Name="loadBtn" Width="71" Click="loadBtn_Click" />
        </Grid>
    </Window>


    点击Load时候载入图像

    private void button1_Click(object sender, RoutedEventArgs e)
            {
                a = genValue();
                LineCreate.ItemsSource = a;
            }

    我尝试过重载图像的时候将能清空的值尽量清空,也尝试过GC的一些基本操作,但是没有取得多少效果。

    不知道这是否是toolkit chart本身的内存回收有问题,还是我的操作有失误的地方。如果本身有问题,该如何去弥补呢?

    谢谢

    2012年9月10日 2:23
  • LineCreate这个ItemsControl 是以XAML的形式,直接写在窗口上的么

    你试一下,LineCreate创建在其他地方,然后以Children的方式添加进来.Point修改的时候,移除原来的ItemsControl创建一个新的.然后GC.看看是不是有效果.

    我有一次就是这样解决的


    与我交流:点击这里给我发消息


    2012年9月22日 12:27