打印

Silverlight的内存泄露问题?

写了个程序,由于动态New出来的对象比较多,被人发现有少量的内存泄露问题。仔细找了好几圈,确认所有引用都被释放了,但问题依然存在。后来仔细观察发现,即使是一个简单的按钮事件:鼠标移进去变色,移出来恢复原来的颜色,这样的情况下内存也会持续增长,尽管增长幅度不尽相同。

于是写了个简单的测试程序,有两个按钮:点击Add按钮,动态new出8000个Ellipse,大小为10*10,半透明;点击Delete按钮,从界面上移除这8000个Ellipse,使用Children.Clear()方法。经测试发现,每次Add以后,再Delete,内存只有极少量的回收(估计是从界面渲染上回收的),而每次Add之后内存增长都在10兆到20兆。测试代码如下:
复制内容到剪贴板
代码:
        public void Page_Loaded(object o, EventArgs e)
        {
            // Required to initialize variables
            InitializeComponent();
            addNew.MouseLeftButtonUp += new MouseEventHandler(addNew_MouseLeftButtonUp);
            delAll.MouseLeftButtonUp += new MouseEventHandler(delAll_MouseLeftButtonUp);
        }
        void delAll_MouseLeftButtonUp(object sender, MouseEventArgs e)
        {
            t.Children.Clear();
            t.Children = new VisualCollection();
        }
        void addNew_MouseLeftButtonUp(object sender, MouseEventArgs e)
        {
            for (int i = 0; i < 8000; i++)
            {
                Ellipse elps = new Ellipse();
                elps.Fill = new SolidColorBrush(Color.FromArgb((byte)99, (byte)00, (byte)00, (byte)00));
                elps.Width = 10;
                elps.Height = 10;
                elps.SetValue(Canvas.LeftProperty, (i % 53) * 12);
                elps.SetValue(Canvas.TopProperty, (i / 53) * 12);
                t.Children.Add(elps);
            }
        }
不知道还有没有哪位碰到过类似的问题?另外,有兴趣的可以用上面的代码试试~
http://ooboy.net 我只是我

TOP

代码好像有问题.
Children.Clear()和Delete不是清内存.

TOP

但是应该有自动回收的机制,却一直不回收,不知道要怎么才能回收内存?
http://ooboy.net 我只是我

TOP

.NET中内存是系统托管的,回收是自动的.
浅谈C#托管程序中的资源释放问题

[ 本帖最后由 langmuir 于 2007-12-21 21:00 编辑 ]

TOP

现在问题就在这里,他一直不回收内存,所以我才觉得有内存泄露的问题……

用GC.Collect();前几次效果不明显,但到后来貌似还是能回收大部分的内存

[ 本帖最后由 Fdream 于 2007-12-24 14:41 编辑 ]
http://ooboy.net 我只是我

TOP

大量使用基于形状(Shape)的对象的确会导致性能问题,因为它们支持样式、数据绑定、资源、布局、键盘鼠标感压笔等事件,如果不需要这些事件,可以使用Geometries替代。因此,不要大量的new很多Rectangle、Ellipse之类的,尽量重复使用已经New出来的这些东西吧~

(不过这样也太不方便了吧?这个与内存泄露好像也没有必然的联系?难道就没有办法回收内存?)

Silverlight官方论坛上有人回复原文:
引用:
I was just reading something related yesterday in Nathan's WPF Unleashed.

I think it applies to your situation since you're creating 8000 ellipses. On page 386, there is a Warning entitled "Overuse of Shapes can lead to performance problems!". The excerpt says: "When you have Shape-based artwork, every single Shape supports Styles, data binding, resources, layout, keyboard/mouse/stylus input and focus, routed events, and so on.... this is typically unnecessary overhead. Keep this in mind if you find yourself using more than a small number of Shapes."

So it seems that Geometries might be a better approach in your case.
[ 本帖最后由 Fdream 于 2007-12-24 11:05 编辑 ]
http://ooboy.net 我只是我

TOP