c# - WPF memory leak -
i have simple wpf application. in main window have stack panel , 2 buttons. first button adds 100 user controls (without data bindings, events, bitmaps), , second removes of them panel , calls gc.collect(). , there problems: 1. after clicked "remove" button first time not memory releases, , must click few times release more memory. 2. after 5 - 10 min memory releases few megabytes dont.
for example after app starts takes ~22mb when adding 500 controls - ~60mb after clicked "remove" button first time - ~55mb (i wait time, memory not deallocated) click few times , memory fell down 25mb, dont understand this, new in wpf, , maybe miss want release memory immediately.
<window x:class="wpfapplication10.mainwindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" title="mainwindow" height="385" width="553"> <grid> <grid.rowdefinitions> <rowdefinition height="25" /> <rowdefinition height="240*" /> <rowdefinition height="25" /> </grid.rowdefinitions> <grid name="border1" grid.row="1" horizontalalignment="stretch" verticalalignment="stretch" > <scrollviewer verticalalignment="stretch" name="scrollviewer1" horizontalalignment="stretch"> <stackpanel margin="3,3,3,3" background="transparent" verticalalignment="stretch" name="activitystackpanel" horizontalalignment="stretch"> </stackpanel> </scrollviewer> </grid> <button content="button" grid.row="2" height="23" horizontalalignment="left" margin="12,0,0,0" name="button1" verticalalignment="top" width="75" click="button1_click" /> <button content="button" grid.row="2" height="23" horizontalalignment="left" margin="141,0,0,0" name="button2" verticalalignment="top" width="75" click="button2_click" /> <label content="label" grid.rowspan="2" height="28" horizontalalignment="left" margin="34,0,0,0" name="label1" verticalalignment="top" /> </grid>
namespace wpfapplication10 { public partial class mainwindow : window { public mainwindow() { initializecomponent(); } private void button1_click(object sender, routedeventargs e) { int n = 100; //var r = new activitystatisticitem("111", "222", datetime.now, "333", 1); (int = 0; < n; i++) { activitystackpanel.children.add(new usercontrol1()); } label1.content = activitystackpanel.children.count; } private void button2_click(object sender, routedeventargs e) { activitystackpanel.children.clear(); label1.content = activitystackpanel.children.count; gc.collect(); gc.waitforpendingfinalizers(); gc.collect(); } } } <usercontrol x:class="wpfapplication10.usercontrol1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" background="transparent" margin="0,2,0,2" minheight="80" minwidth="130" maxheight="80"> <grid width="441"> <grid.rowdefinitions> <rowdefinition height="40" name="rowtop" /> <rowdefinition height="40" name="rowbottom"/> </grid.rowdefinitions> <border borderbrush="gray" borderthickness="1" horizontalalignment="stretch" background="lightgreen" name="contactpanel" cornerradius="3,3,3,3" verticalalignment="stretch" panel.zindex="1" > <grid verticalalignment="stretch" name="grid1" margin="3,0,3,0" horizontalalignment="stretch"> <label content="contact" height="15" horizontalalignment="left" margin="15,3,0,0" name="headerlabel" padding="0" verticalalignment="top" fontsize="10" fontweight="demibold"/> <label content="00/00/0000 00:00:00" height="15" horizontalalignment="left" margin="13,18,0,0" name="timelabel" padding="0" verticalalignment="top" fontsize="10" width="100" fontweight="demibold" /> <label content="00:00:00" height="15" horizontalalignment="right" margin="0,18,0,0" name="durationlabel" padding="0" verticalalignment="top" fontsize="10" width="38" fontweight="demibold"/> <!--<image height="12" horizontalalignment="left" margin="0,3,0,0" name="directionpicturebox" stretch="fill" verticalalignment="top" width="12" /> <image height="12" horizontalalignment="right" margin="0,20,41,0" name="timerimage" stretch="fill" verticalalignment="top" width="12" /> <image height="12" horizontalalignment="left" margin="0,20,0,0" name="datetimeimage" stretch="fill" verticalalignment="top" width="12" />--> </grid> </border> <border borderbrush="gray" borderthickness="1,0,1,1" grid.row="1" background="white" horizontalalignment="stretch" margin="10,0,10,0" name="detailspanel" cornerradius="0,0,3,3" verticalalignment="stretch"> <grid horizontalalignment="stretch" name="grid2" margin="3,0,3,0" verticalalignment="stretch"> <label content="label" height="15" horizontalalignment="stretch" fontsize="9" padding="0" margin="0,3,0,0" name="numberradlabel" verticalalignment="top" /> <label content="label" height="15" horizontalalignment="stretch" fontsize="9" padding="0" margin="0,18,0,0" name="queueradlabel" verticalalignment="top" /> </grid> </border> </grid>
in user control have
public usercontrol1() { initializecomponent(); }
i want release memory immediately.
don't. trust gc.
gc.collect(); gc.waitforpendingfinalizers(); gc.collect();
don't. trust gc.
after 5 - 10 min memory releases
didn't trust gc?
garbage collection model make sure unwanted managed memory in system released (which includes of controls memory). uses algorithm optimising includes generations, free memory available, possibly cpu available...
gc.collect()
interfere it.gc.collect()
asynchronous no immediate effect.the resource need careful unmanaged resource handled dispose pattern. otherwise don't mess gc, job well.
Comments
Post a Comment