c#


Memory leak in RenderTargetBitmap


I'm using a RenderTargetBitmap to render a set of controls in order to generate a PDF. The following code segment is the relevant section:
public Drawing.Image RenderPageBitmap()
{
RenderTargetBitmap bit = null;
Drawing.Bitmap bmp = null;
try
{
bit = new RenderTargetBitmap(ImageSource.PixelWidth, ImageSource.PixelHeight, 96, 96, PixelFormats.Pbgra32);
var viewBox = GetPageXaml(); //This method loads some prebuilt XAML from an embedded resource, setting the DataContext as needed.
var siz = new Size(bit.PixelWidth, bit.PixelHeight);
viewBox.Measure(siz);
viewBox.Arrange(new Rect(siz));
viewBox.UpdateLayout();
var draw = new DrawingVisual();
using (var graph = draw.RenderOpen())
graph.DrawRectangle(new BitmapCacheBrush(viewBox), null, new Rect(siz));
bit.Render(draw);
bit.Freeze();
bmp = new Drawing.Bitmap(bit.PixelWidth, bit.PixelHeight, Imaging.PixelFormat.Format32bppPArgb);
var data = bmp.LockBits(new Drawing.Rectangle(Drawing.Point.Empty, bmp.Size), ImageLockMode.WriteOnly, Imaging.PixelFormat.Format32bppPArgb);
{
bit.CopyPixels(Int32Rect.Empty, data.Scan0, data.Height * data.Stride, data.Stride);
}
bmp.UnlockBits(data);
return bmp;
}
catch (Exception)
{
bmp?.Dispose();
throw;
}
finally
{
bit?.Clear();
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
}
}
Even following other answers on StackOverflow and other forums (like clearing the bitmap and performing a garbage collection) doesn't seem to solve the issue. Each loop of this code can leak ~100MB of memory, which means I quickly hit the ~2GB limit of 32-bit processes.
The leak seems to occur on the RenderTargetBitmap.Render method exclusively, even the DrawingContext.DrawRectangle call doesn't noticeably increase memory usage.
Is there anything I can do to solve this problem?
You return the Bitmap to somewhere. Make sure you Dispose the Bitmap instance once you are done with it. What you are doing in the finally is useless when there is memory leak. If there are references GC wouldn't collect it.
Each loop of this code can leak ~100MB of memory, which means I
quickly hit the ~2GB limit of 32-bit processes.
Are you assuming there is a memory leak? May be there is no memory leak. I would get a good memory profiling tool and test this.
I have used ANTS Memory profiler and I find it good (it comes with 14 days trial). Just execute your logic a few times and see the Instance List if anything is growing. If so, look at the Retention graph to see what holds onto it. That will tell you what exactly happening. Root causes for memory leaks are quite difficult to guess sometimes, fortunately there are good tools for that.
Based on my inspection, draw allocates a DrawingVisual object.
Unless Render() frees it inside, you should explicitly delete the DrawingVisual object.

Related Links

Issue with Photometric Interpretation tag
Fixing possible memory leak in RelayCommand
Draw control like Google chrome
Expression tree creation with TryParse and Convert C#
Best way to keep a list in a wcf service memory
Gala type of game list of missile and list of asteroid collisions
MVC map Viewmodels to domain models
OpenGL transformations not working as expected
How do I join strings from a List<string> while also formating them?
how to select latest item on top of the list and rest of the item in sorted order
Convert Image to Bytes and save in Xml
Passing parameters on button click in strongly-typed view to another controller
Why does this implementer method not see its sibling? [closed]
Returning Data to Previous a ViewModel using Prism Navigation
SQL query resultset is case insensitive
Why this case of generic type instantiation doesn't work?

Categories

HOME
qlikview
actionscript-3
oop
twitter-bootstrap
cors
locale
spotfire
cryengine
coordinates
sdk
browser-cache
procmon
virtualhost
ejb-3.0
angularjs-ng-repeat
vichuploaderbundle
captcha
template10
ofbiz
project-structure
restructuredtext
xna
rndis
scrapy-spider
aws-certificate-manager
oracle10g
android-6.0-marshmallow
dynamic-memory-allocation
uibarbuttonitem
dynamics-ax-2012-r3
kundera
schedule
andengine
foxpro
multilanguage
keil
jcr
epub
rtos
imageprocessor
apache-falcon
rythm
office-interop
vertical-alignment
file-descriptor
web-technologies
grails-2.0
gradlew
easyquery
multivalue
ear
richtext
jtextarea
was
stringbuilder
deck.js
hoare-logic
git-cherry-pick
queuing
django-celery
shtml
custom-build-step
containstable
jersey-test-framework
nonblocking
web-performance
bioconductor
angular-promise
transbase
transport
jsoncpp
tess4j
tokudb
random-access
information-hiding
jsonschema2pojo
novell
conditional-comments
nsmutableurlrequest
satisfiability
nodeunit
nsnumber
stringstream
windows-scheduler
pymel
urlfetch
freeimage
correctness
hypertable
django-1.4
optimistic-concurrency
wxperl
inserthtml
scsf
mcpd
sessiontracking
method-call
cinder
chars
mdd
pixel-bender
atmega16
httpbrowsercapabilities

Resources

Mobile Apps Dev
Database Users
javascript
java
csharp
php
android
MS Developer
developer works
python
ios
c
html
jquery
RDBMS discuss
Cloud Virtualization
Database Dev&Adm
javascript
java
csharp
php
python
android
jquery
ruby
ios
html
Mobile App
Mobile App
Mobile App