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

Popular posts from this blog

c# - SharpSVN - How to get the previous revision? -

c++ - Is it possible to compile a VST on linux? -

url - Querystring manipulation of email Address in PHP -