none
Silverlight 实例大量UserControl后,内存释放的问题 RRS feed

  • 问题

  • 我自己写了一个UserControl,非常简单,一个textblock,一个path而已,然后实例了10000个,放置在一个容器对象内,发现内存由一开始的50MB变更成了500多MB,随后调用容器.children.clear();清除所有实例,发现内存并没有减少,期间还试过以下几个方法,均无效:

    循环容器.children,将每个对象取出后置null, System.GC.Collect()、System.GC.WaitForPendingFinalizers() 、Dispose()、Finalize()发现都不行,当然,最小化IE也试过了,还是不行。

    2011年1月17日 15:51

答案

  • # 第三次实验的时候未等待10分钟,建完10000个后clear,然后在创建10000个,内存从252M左右升至300M左右的时候突然下降至160M左右,最后又升到250M左右。

    看来不是内存泄漏问题

    就我所知,Silverlight里没有好的办法来强制GC。 “选择时机”是指Silverlight判断系统可用内存量等等很多因素进行选择的。 
    Mog Liang
    Please mark the replies as answers if they help or unmark if not.
    If you have any feedback about my replies, please contact msdnmg@microsoft.com.
    Microsoft One Code Framework
    • 已建议为答案 Mog Liang 2011年1月24日 9:46
    • 已标记为答案 Mog Liang 2011年2月7日 6:34
    2011年1月19日 8:57

全部回复

  • 可能是因为控件还被其他对象引用。你检查一下你的UserControl是否注册一些外部对象的事件。

    你也可以用WinDbg来检查Silverlight,参见此文

    http://davybrion.com/blog/2009/08/finding-memory-leaks-in-silverlight-with-windbg/

    谢谢


    Mog Liang
    Please mark the replies as answers if they help or unmark if not.
    If you have any feedback about my replies, please contact msdnmg@microsoft.com.
    Microsoft One Code Framework
    2011年1月18日 8:13
  • 可能是因为控件还被其他对象引用。你检查一下你的UserControl是否注册一些外部对象的事件。

    你也可以用WinDbg来检查Silverlight,参见此文

    http://davybrion.com/blog/2009/08/finding-memory-leaks-in-silverlight-with-windbg/

    谢谢


    Mog Liang
    Please mark the replies as answers if they help or unmark if not.
    If you have any feedback about my replies, please contact msdnmg@microsoft.com.
    Microsoft One Code Framework


    正在下,比较慢。

    我尝试了一下,在bingmap silverligth 控件上,新建一个图层,图层里实例1000个对象,然后删除,内存仍然没有销毁

    代码如下:

     Public Sub CreateTestSymbol()
        Dim rnd As New Random
        For index = 1 To 1000
          Dim aPushpin As New Pushpin
          aPushpin.Location = New Location(rnd.Next(30, 39) + rnd.NextDouble, rnd.Next(116, 120) + rnd.NextDouble)
          TargetLayer.Children.Add(aPushpin)
        Next
     End sub
    
     Public Sub DeleteTestSymbol()
       TargetLayer.Children.clear()
     End sub
    
    除了两个button调用上述过程外,没有其它代码了。1000个内存占用多了30M左右,10000个是多大?
    2011年1月18日 14:26
  • 常用的SL内存释放方法:

    1)  UIElement控件实例= null

    2)  定时调用GC.Collect()

    3)  让控件继承Idisposable接口,并实现相应逻辑

     

    希望对你有用~


    My blog: http://blog.csdn.net/dotfun http://dotfun.cnblogs.com

    My contact: QQ:372900288 E-mail:372900288@qq.com msn:sellnet007@hotmail.com


    《银光志--Silverlight 3.0开发详解与最佳实践》
    2011年1月18日 15:35
    版主
  • 常用的SL内存释放方法:

    1)  UIElement控件实例= null

    2)  定时调用GC.Collect()

    3)  让控件继承Idisposable接口,并实现相应逻辑

     

    希望对你有用~


    这个太常用了,我相信你开发的项目中没有实例到10000个控件的时候,也相信大多数程序员不注意年龄到底是用byte还是int,所以你给出的常用方法没有用……自己实践一下!
    2011年1月18日 17:58
  • 因为Silverlight 的 GC是不受代码控制的,即使手动调用GC.Collect(),它仍然会自己选择时机来回收的。你试试创建10000个button看Silverlight会回收不。

    另外,用WinDbg可以查看对象上的引用,你可以尝试寻找指向这1000个button的引用是谁。


    Mog Liang
    Please mark the replies as answers if they help or unmark if not.
    If you have any feedback about my replies, please contact msdnmg@microsoft.com.
    Microsoft One Code Framework
    2011年1月19日 1:26
  • 因为Silverlight 的 GC是不受代码控制的,即使手动调用GC.Collect(),它仍然会自己选择时机来回收的。你试试创建10000个button看Silverlight会回收不。

    另外,用WinDbg可以查看对象上的引用,你可以尝试寻找指向这1000个button的引用是谁。


    Mog Liang
    Please mark the replies as answers if they help or unmark if not.
    If you have any feedback about my replies, please contact msdnmg@microsoft.com.
    Microsoft One Code Framework


    我不知道兄弟在回复的时候是否动手做实验,我根据您的意思,实例了10000个button,然后clear,实验的结果是实例前,内存占用70M,实例10000个button后,内存变成了252M左右,随后 clear,内存不变,观察10分钟后内存没有变化,最小化IE后内存没有变化,又观察10分钟内存仍然没有变化。

    两次实验都是这样。

    第三次实验的时候未等待10分钟,建完10000个后clear,然后在创建10000个,内存从252M左右升至300M左右的时候突然下降至160M左右,最后又升到250M左右。

    两次实验一样。

    实验说明,clear后并没有释放内存,并没有“选择时机”,而是固定在新增加实例的时候释放。如果我一直不增加新实例呢?内存如何释放?

    Bingmap是否也这样,我随后实验。另外,windbg在我这运行不起来,成功加载了sos.dll后提示说没有正确的crl.dll,请问是什么原因呢?

    代码如下:

    XAML:

    <UserControl x:Class="SilverlightApplication1.MainPage"
      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"
      mc:Ignorable="d"
      d:DesignHeight="300" d:DesignWidth="400">
      
      <Grid x:Name="grdMain">
        <Button x:Name="btnCreate" Content="Create" Click="btnCreate_Click" Height="23" HorizontalAlignment="Left" Margin="27,12,0,0" VerticalAlignment="Top" Width="75" />
        <Button x:Name="btnClear" Content="Clear" Click="btnClear_Click" Height="23" HorizontalAlignment="Left" Margin="128,12,0,0" VerticalAlignment="Top" Width="75" />
        <Grid x:Name="grdTest"/>
      </Grid>
    </UserControl>
    

    .VB

    Partial Public Class MainPage
      Inherits UserControl
    
      Public Sub New()
        InitializeComponent()
      End Sub
    
      Private Sub btnCreate_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
        For i As Integer = 0 To 9999
          Dim button As New Button
          button.Width = 20
          button.Height = 5
          grdTest.Children.Add(button)
        Next
        MessageBox.Show("ok!")
      End Sub
    
      Private Sub btnClear_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
        grdTest.Children.Clear()
        MessageBox.Show("ok!")
      End Sub
    End Class
    
    2011年1月19日 2:18
  • # 第三次实验的时候未等待10分钟,建完10000个后clear,然后在创建10000个,内存从252M左右升至300M左右的时候突然下降至160M左右,最后又升到250M左右。

    看来不是内存泄漏问题

    就我所知,Silverlight里没有好的办法来强制GC。 “选择时机”是指Silverlight判断系统可用内存量等等很多因素进行选择的。 
    Mog Liang
    Please mark the replies as answers if they help or unmark if not.
    If you have any feedback about my replies, please contact msdnmg@microsoft.com.
    Microsoft One Code Framework
    • 已建议为答案 Mog Liang 2011年1月24日 9:46
    • 已标记为答案 Mog Liang 2011年2月7日 6:34
    2011年1月19日 8:57
  • 我自己创建的usercontrol就释放不了。
    2011年1月21日 2:02
  • 我自己创建的usercontrol就释放不了。


    你是指你创建的UserControl可能存在内存泄漏问题?可否把代码贴一下?


    Mog Liang
    Please mark the replies as answers if they help or unmark if not.
    If you have any feedback about my replies, please contact msdnmg@microsoft.com.
    Microsoft One Code Framework
    2011年1月21日 7:31
  • 不知楼主有没有对掌上系统上软件不能关闭困惑过,我困惑过,然后慢慢地理解这是个理念问题。

    我的理解是:sl注重于客户体验,也有相似的理念。

    我的设计方法是对加载的控件反复的重用它,而不是象我们习惯的做法是打开一个窗口待用户用完后关闭它。

     

     

    2011年1月25日 0:29