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

Pass Linq Expression to a function
nHibernate stored procedure call
Invalid authorization specification and Invalid connection string attribute
How to bind list inside a list to a GridView in ASP.NET
How can I use a client certificate with a missing CA to communicate with a external Web service?
Registering and using forms with Windsor
Fast serialization/deserialization of structs
Sending UTF-8 Text Messages on C# using TIBCO EMS
Strategy, State, Singleton… or a Composition thereof?
Handling the events of a Interop control in C#
Regex to capture text around a literal
Why my TempData is not working
Fetching information from a database
data type mismatch in criteria expression in c# 2010
Skip DataMember via DataContractSerializer
ServicedComponent Com proxy eventually fails

Categories

HOME
ssms
grizzly
domain-driven-design
gsm
ssh
display
window.open
azure-resource-manager
mailchimp
ms-access-2010
angularjs-directive
richtextbox
meson-build
open-search-server
token
wkhtmltopdf
angularjs-ng-repeat
dcos
solidity
mbed
swift3.1
dompdf
udeploy
react-jsx
turn.js
ejb-3.1
inline-assembly
poisson
pixels
vtd-xml
visual-prolog
circle
gitosis
certbot
javafxports
leaderboard
kofax
definition
php-mongodb
intervention
import.io
dna-sequence
openpgp.js
senti-wordnet
blackberry
bipartite
vertex-shader
alarmmanager
timefield
instaparse
qtruby
sprockets
phpdesigner
paypal-subscriptions
calc
ooad
apache2-module
dday
cascading
angular-promise
persian
dpkt
borland-c++
vensim
beagleboard
fiware-health
pysvn
iphone-6
fedena
os.walk
conditional-comments
xmlserializer
formbuilder
indic
satisfiability
object-oriented-database
google-mirror-api
myrrix
dd4t
uikit-dynamics
pymel
brew
microsoft-speech-platform
configurationsection
invalidoperationexception
filedialog
nserror
win-prolog
hwnd
activescaffold
google-local-search
web-widget
coderush-xpress
html-help-workshop
bootstrap-protocol

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