i trying release memory held images when removing images sample. have attached sample illustrate issue.
steps reproduce issue:
step 1: run sample, note 21 mb consumed sample
step 2: click on addctrl button, 54 mb consumed
step 3: click on removectrl button, memory consumed not released.
i posted in microsoft's forum, issue operating system. can point me out workaround available release memory being held.
garbage collection in .net doesn't release memory right away when objects no longer referenced, in case there's more it. in sample, code adds images adding them stackpanel, remove button tries clear them removing scrollviewer, parent of stackpanel, parent grid. original code:
private void btnremovecontrol_click(object sender, routedeventargs e) { parentgrid.children.remove(scrollviewer); }
i thought odd way it, changed code remove images stackpanel added:
private void btnremovecontrol_click(object sender, routedeventargs e) { stackpanel.children.clear(); }
this resulted in of memory being freed upon remove button being clicked. in tests, clicking add bump memory 50 mb, , clicking remove new code make drop 29 mb.
but remember, .net isn't super aggressive reclaiming memory unless it's under pressure. so, added line:
private void btnremovecontrol_click(object sender, routedeventargs e) { stackpanel.children.clear(); gc.collect(); }
with code, clicking remove drops memory 50 mb 12 mb in test.
however, putting gc.collect() calls in code bad idea , terrible performance, because forces immediate gc on generations. it's best let .net clean memory when thinks needs to. added line prove whether gc can free rest of memory if needs to.
what need make sure you're not holding onto references objects no longer need, .net can clean memory when gets around it. in original code, believe scrollviewer still being referenced somewhere, perhaps because it's defined in xaml. scrollviewer holds reference stackpanel, holds references images, , result none of them can garbage collected. if remove images, you're trying free memory, works.