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

Sandcastle and other documentation tools
How to display data in Repeater using asp.net webforms?
C# Changing main thread's button text from another thread
Why does Automapper map a concrete collection to a new instance each time the source collection is referenced?
Upgrade from WebMatrix to Identity
SimpleMembership - object 'Users' already exists
How to know a textbox is Bold and Italic or not?
How to determine file structure of ASP.NET website and roll it into a project/solution?
Regarding cookies accessibility in virtual directories
Creating an (Lambda) Expression using recursion
Loading resource files with AngleSharp
How do I properly test an API Controller that returns json for a non null response?
Mvc6 routing (RoutePrefix and AreaPrefix)
PostAsJson not serializing correctly?
Log to database with EF Code First
How to modify properties of the incoming object without creating a new instance?

Categories

HOME
joomla
autohotkey
gulp
gcc
twitter-bootstrap
swift3
ide
system-calls
ssh
arguments
thermal-printer
ms-access-2010
vsixmanifest
distinct
background-image
greensock
versioning
filehelpers
alert
novacode-docx
multipart
screen-scraping
scrapy-spider
akavache
openoffice-impress
boost-log
slim-lang
imdb
flickr
headphones
asp.net-webhooks
perf
sdl-2
azure-storage-files
yelp
libconfig
jslider
qtwebkit
spring-data-commons
spring-cloud-bus
dcom
monaca
rmq
pyautogui
esprima
turbolinks
distcc
hdr
supervised-learning
razorengine
bbedit
angular-promise
windows-kernel
play-json
serial-communication
jts
self-join
personality-insights
android-filterable
azure-mobile-app
polarion
minko
screen-lock
wingdb
atg-dynamo
reactjs-native
image-preloader
fastcgi-mono-server
php-amqplib
complete
dylan
oc4j
magicsuggest
cloudmade
pymel
reference-manual
biztalk-deployment
ncml
cron4j
correctness
custom-cursor
mcpd
overlays
object-tag
hs-err
onresize

Resources

Database Users
RDBMS discuss
Database Dev&Adm
javascript
java
csharp
php
android
javascript
java
csharp
php
python
android
jquery
ruby
ios
html
Mobile App
Mobile App
Mobile App