积极答复者
Silverlight 实例大量UserControl后,内存释放的问题

问题
-
我自己写了一个UserControl,非常简单,一个textblock,一个path而已,然后实例了10000个,放置在一个容器对象内,发现内存由一开始的50MB变更成了500多MB,随后调用容器.children.clear();清除所有实例,发现内存并没有减少,期间还试过以下几个方法,均无效:
循环容器.children,将每个对象取出后置null, System.GC.Collect()、System.GC.WaitForPendingFinalizers() 、Dispose()、Finalize()发现都不行,当然,最小化IE也试过了,还是不行。
答案
-
# 第三次实验的时候未等待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
全部回复
-
可能是因为控件还被其他对象引用。你检查一下你的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 -
可能是因为控件还被其他对象引用。你检查一下你的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个对象,然后删除,内存仍然没有销毁
代码如下:
除了两个button调用上述过程外,没有其它代码了。1000个内存占用多了30M左右,10000个是多大?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
-
常用的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开发详解与最佳实践》 -
因为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 -
因为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
-
# 第三次实验的时候未等待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 -
我自己创建的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