Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Exploring .NET memory
management
A trip down memory lane
Maarten Balliauw
@maartenballiauw
Agenda
Garbage Collector
Helping the GC
Allocations & hidden allocations
Strings
Exploring the heap
Garbage Collector
.NET memory management 101
Memory allocation
Objects allocated in “managed heap” (big chunk of memory)
Allocating memory i...
.NET memory management 101
Memory allocation
Memory release or “Garbage Collection” (GC)
GC releases objects no longer in ...
.NET memory management 101
Memory allocation
Memory release or “Garbage Collection” (GC)
Generations
Large Object Heap
Gen...
.NET memory management 101
Memory allocation
Memory release or “Garbage Collection” (GC)
Generations
Large Object Heap (LO...
The .NET garbage collector
When does it run? Vague… But usually:
Out of memory condition – when the system fails to alloca...
The .NET garbage collector
Runs very often for gen0
Short-lived objects, few references, fast to clean
Local variable
Web ...
Helping the GC, avoid pauses
Optimize allocations (e.g. use struct when it makes sense, object pooling)
Don’t allocate at ...
Helping the GC
DEMO
https://github.com/maartenba/memory-demos
Allocations
When is memory allocated?
Not for value types (int, bool, struct, decimal, enum, float, byte, long, …)
Allocated on stack,...
Hidden allocations!
Boxing!
Put and int in a box
Take an int out of a box
Lambda’s/closures
Allocate compiler-generated
Di...
How to find them?
Experience
Intermediate Language (IL)
Profiler
“Heap allocations viewer”
ReSharper Heap Allocations View...
Hidden allocations
DEMO
https://github.com/maartenba/memory-demos
ReSharper Heap Allocations Viewer plugin
Roslyn’s Heap A...
Don’t optimize what
should not be
optimized.
Measure!
We know when allocations are done...
...but perhaps these don’t matter.
Measure!
How frequently are we allocating...
Garbage Collector & Allocations
GC is optimized for high memory traffic in short-lived objects
Use that knowledge! Don’t f...
Strings
Strings are objects
.NET tries to make them look like a value type, but they are a reference type
Read-only collection of ...
String duplicates
Any .NET application has them (System.Globalization duplicates quite a few)
Are they bad?
.NET GC is fas...
Duplicate strings
DEMO
https://github.com/maartenba/memory-demos
String literals
Are all strings on the heap? Are all strings duplicated?
var a = "Hello, World!";
var b = "Hello, World!";...
Portable Executable (PE)
#UserStrings
DEMO
https://github.com/maartenba/memory-demos
String literals in #US
Compile-time optimization
Store literals only once in PE header metadata stream ECMA-335 standard, ...
String interning
Store (and read) strings from the intern pool
Simply call String.Intern when “allocating” or reading the ...
String interning caveats
Why are not all strings interned by default?
CPU vs. memory
Not on the heap but on intern pool
No...
Exploring the heap
for fun and profit
How would you do it...
// TODO: Build managed type system, stored in memory,
CPU/memory friendly
Probably:
Store type info...
Stuff on the Managed Heap
(scroll down for more...)
IT is just mapping mappings.
Pointer to an “instance”
Instance
Pointer to Runtime Type Information (RTTI)
Field values (wh...
Theory is nice...
Microsoft.Diagnostics.Runtime (ClrMD)
“ClrMD is a set of advanced APIs for programmatically inspecting a...
ClrMD
DEMO
https://github.com/maartenba/memory-demos
Conclusion
Conclusion
Garbage Collector (GC) optimized for high memory traffic + short-lived objects
Don’t fear allocations! But bewa...
Thank you!
http://blog.maartenballiauw.be
@maartenballiauw
Upcoming SlideShare
Loading in …5
×

of

ConFoo - Exploring .NET’s memory management – a trip down memory lane Slide 1 ConFoo - Exploring .NET’s memory management – a trip down memory lane Slide 2 ConFoo - Exploring .NET’s memory management – a trip down memory lane Slide 3 ConFoo - Exploring .NET’s memory management – a trip down memory lane Slide 4 ConFoo - Exploring .NET’s memory management – a trip down memory lane Slide 5 ConFoo - Exploring .NET’s memory management – a trip down memory lane Slide 6 ConFoo - Exploring .NET’s memory management – a trip down memory lane Slide 7 ConFoo - Exploring .NET’s memory management – a trip down memory lane Slide 8 ConFoo - Exploring .NET’s memory management – a trip down memory lane Slide 9 ConFoo - Exploring .NET’s memory management – a trip down memory lane Slide 10 ConFoo - Exploring .NET’s memory management – a trip down memory lane Slide 11 ConFoo - Exploring .NET’s memory management – a trip down memory lane Slide 12 ConFoo - Exploring .NET’s memory management – a trip down memory lane Slide 13 ConFoo - Exploring .NET’s memory management – a trip down memory lane Slide 14 ConFoo - Exploring .NET’s memory management – a trip down memory lane Slide 15 ConFoo - Exploring .NET’s memory management – a trip down memory lane Slide 16 ConFoo - Exploring .NET’s memory management – a trip down memory lane Slide 17 ConFoo - Exploring .NET’s memory management – a trip down memory lane Slide 18 ConFoo - Exploring .NET’s memory management – a trip down memory lane Slide 19 ConFoo - Exploring .NET’s memory management – a trip down memory lane Slide 20 ConFoo - Exploring .NET’s memory management – a trip down memory lane Slide 21 ConFoo - Exploring .NET’s memory management – a trip down memory lane Slide 22 ConFoo - Exploring .NET’s memory management – a trip down memory lane Slide 23 ConFoo - Exploring .NET’s memory management – a trip down memory lane Slide 24 ConFoo - Exploring .NET’s memory management – a trip down memory lane Slide 25 ConFoo - Exploring .NET’s memory management – a trip down memory lane Slide 26 ConFoo - Exploring .NET’s memory management – a trip down memory lane Slide 27 ConFoo - Exploring .NET’s memory management – a trip down memory lane Slide 28 ConFoo - Exploring .NET’s memory management – a trip down memory lane Slide 29 ConFoo - Exploring .NET’s memory management – a trip down memory lane Slide 30 ConFoo - Exploring .NET’s memory management – a trip down memory lane Slide 31 ConFoo - Exploring .NET’s memory management – a trip down memory lane Slide 32 ConFoo - Exploring .NET’s memory management – a trip down memory lane Slide 33 ConFoo - Exploring .NET’s memory management – a trip down memory lane Slide 34 ConFoo - Exploring .NET’s memory management – a trip down memory lane Slide 35 ConFoo - Exploring .NET’s memory management – a trip down memory lane Slide 36 ConFoo - Exploring .NET’s memory management – a trip down memory lane Slide 37
Upcoming SlideShare
What to Upload to SlideShare
Next
Download to read offline and view in fullscreen.

0 Likes

Share

Download to read offline

ConFoo - Exploring .NET’s memory management – a trip down memory lane

Download to read offline

The .NET Garbage Collector (GC) is really cool. It helps providing our applications with virtually unlimited memory, so we can focus on writing code instead of manually freeing up memory. But how does .NET manage that memory? What are hidden allocations? Are strings evil? It still matters to understand when and where memory is allocated. In this talk, we’ll go over the base concepts of .NET memory management and explore how .NET helps us and how we can help .NET – making our apps better. Expect profiling, Intermediate Language (IL), ClrMD and more!

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all
  • Be the first to like this

ConFoo - Exploring .NET’s memory management – a trip down memory lane

  1. 1. Exploring .NET memory management A trip down memory lane Maarten Balliauw @maartenballiauw
  2. 2. Agenda Garbage Collector Helping the GC Allocations & hidden allocations Strings Exploring the heap
  3. 3. Garbage Collector
  4. 4. .NET memory management 101 Memory allocation Objects allocated in “managed heap” (big chunk of memory) Allocating memory is fast, it’s just adding a pointer Some unmanaged memory is also consumed (not GC-ed) .NET CLR, Dynamic libraries, Graphics buffer, … Memory release or “Garbage Collection” (GC) Generations Large Object Heap
  5. 5. .NET memory management 101 Memory allocation Memory release or “Garbage Collection” (GC) GC releases objects no longer in use by examining application roots GC builds a graph of all the objects that are reachable from these roots Object unreachable? Remove object, release memory, compact heap Takes time to scan all objects! Generations Large Object Heap
  6. 6. .NET memory management 101 Memory allocation Memory release or “Garbage Collection” (GC) Generations Large Object Heap Generation 0 Generation 1 Generation 2 Short-lived objects (e.g. Local variables) In-between objects Long-lived objects (e.g. App’s main form)
  7. 7. .NET memory management 101 Memory allocation Memory release or “Garbage Collection” (GC) Generations Large Object Heap (LOH) Special segment for large objects (>85KB) Collected only during full garbage collection Not compacted (by default) -> fragmentation! Fragmentation can cause OutOfMemoryException
  8. 8. The .NET garbage collector When does it run? Vague… But usually: Out of memory condition – when the system fails to allocate or re-allocate memory After some significant allocation – if X memory is allocated since previous GC Failure of allocating some native resources – internal to .NET Profiler – when triggered from profiler API Forced – when calling methods on System.GC Application moves to background GC is not guaranteed to run http://blogs.msdn.com/b/oldnewthing/archive/2010/08/09/10047586.aspx http://blogs.msdn.com/b/abhinaba/archive/2008/04/29/when-does-the-net-compact-framework-garbage-collector-run.aspx
  9. 9. The .NET garbage collector Runs very often for gen0 Short-lived objects, few references, fast to clean Local variable Web request/response Higher generation Usually more references, slower to clean GC pauses the running application to do its thing Usually short, except when not… Background GC (enabled by default) Concurrent with application threads May still introduce short locks/pauses, usually just for one thread
  10. 10. Helping the GC, avoid pauses Optimize allocations (e.g. use struct when it makes sense, object pooling) Don’t allocate at all Make use of IDisposable / using statement Clean up references, giving the GC an easy job Weak references Allow the GC to collect these objects, no need for checks Finalizers Beware! Moved to finalizer queue -> always gen++
  11. 11. Helping the GC DEMO https://github.com/maartenba/memory-demos
  12. 12. Allocations
  13. 13. When is memory allocated? Not for value types (int, bool, struct, decimal, enum, float, byte, long, …) Allocated on stack, not on heap Not managed by garbage collector For reference types When you new
  14. 14. Hidden allocations! Boxing! Put and int in a box Take an int out of a box Lambda’s/closures Allocate compiler-generated DisplayClass to capture state Params arrays And more! int i = 42; // boxing - wraps the value type in an "object box" // (allocating a System.Object) object o = i; // unboxing - unpacking the "object box" into an int again // (CPU effort to unwrap) int j = (int)o;
  15. 15. How to find them? Experience Intermediate Language (IL) Profiler “Heap allocations viewer” ReSharper Heap Allocations Viewer plugin Roslyn’s Heap Allocation Analyzer Don’t do premature optimization – measure!
  16. 16. Hidden allocations DEMO https://github.com/maartenba/memory-demos ReSharper Heap Allocations Viewer plugin Roslyn’s Heap Allocation Analyzer
  17. 17. Don’t optimize what should not be optimized.
  18. 18. Measure! We know when allocations are done... ...but perhaps these don’t matter. Measure! How frequently are we allocating? How frequently are we collecting? What generation do we end up on? Are our allocations introducing pauses? www.jetbrains.com/dotmemory (and www.jetbrains.com/dottrace)
  19. 19. Garbage Collector & Allocations GC is optimized for high memory traffic in short-lived objects Use that knowledge! Don’t fear allocations! Don’t optimize what should not be optimized… GC is the concept that makes .NET / C# tick – use it! Know when allocations happen GC is awesome Gen2 collection that stop the world not so much… Measure!
  20. 20. Strings
  21. 21. Strings are objects .NET tries to make them look like a value type, but they are a reference type Read-only collection of char Length property A bunch of operator overloading Allocated on the managed heap var a = new string('-', 25); var b = "Hello, World!"; var c = httpClient.GetStringAsync("http://blog.maartenballiauw.be");
  22. 22. String duplicates Any .NET application has them (System.Globalization duplicates quite a few) Are they bad? .NET GC is fast for short-lived objects, so meh. Don’t waste memory with string duplicates on gen2 (but: it’s okay to have strings there)
  23. 23. Duplicate strings DEMO https://github.com/maartenba/memory-demos
  24. 24. String literals Are all strings on the heap? Are all strings duplicated? var a = "Hello, World!"; var b = "Hello, World!"; Console.WriteLine(a == b); Console.WriteLine(Object.ReferenceEquals(a, b)); Prints true twice. So “Hello World” only in memory once?
  25. 25. Portable Executable (PE) #UserStrings DEMO https://github.com/maartenba/memory-demos
  26. 26. String literals in #US Compile-time optimization Store literals only once in PE header metadata stream ECMA-335 standard, section II.24.2.4 Reference literals (IL: ldstr) var a = Console.ReadLine(); var b = Console.ReadLine(); Console.WriteLine(a == b); Console.WriteLine(Object.ReferenceEquals(a, b)); String interning to the rescue!
  27. 27. String interning Store (and read) strings from the intern pool Simply call String.Intern when “allocating” or reading the string Scans intern pool and returns reference var url = "http://blog.maartenballiauw.be"; var stringList = new List<string>(); for (int i = 0; i < 1000000; i++) { stringList.Add(string.Intern(url + "/")); }
  28. 28. String interning caveats Why are not all strings interned by default? CPU vs. memory Not on the heap but on intern pool No GC on intern pool – all strings in memory for AppDomain lifetime! Rule of thumb Lot of long-lived, few unique -> interning good Lot of long-lived, many unique -> no benefit, memory growth Lot of short-lived -> trust the GC Measure!
  29. 29. Exploring the heap for fun and profit
  30. 30. How would you do it... // TODO: Build managed type system, stored in memory, CPU/memory friendly Probably: Store type info (what’s in there, what’s the offset of fieldN, …) Store field data (just data) Store method pointers (“who you gonna call?”) Inheritance information
  31. 31. Stuff on the Managed Heap (scroll down for more...)
  32. 32. IT is just mapping mappings. Pointer to an “instance” Instance Pointer to Runtime Type Information (RTTI) Field values (which can be pointers in turn) RunTime Type Information Interface addresses Instance method addresses Static method addresses …
  33. 33. Theory is nice... Microsoft.Diagnostics.Runtime (ClrMD) “ClrMD is a set of advanced APIs for programmatically inspecting a crash dump of a .NET program much in the same way that the SOS Debugging Extensions (SOS) do. This allows you to write automated crash analysis for your applications as well as automate many common debugger tasks. In addition to reading crash dumps ClrMD also allows supports attaching to live processes.” Maarten’s definition: “LINQ-to-heap”
  34. 34. ClrMD DEMO https://github.com/maartenba/memory-demos
  35. 35. Conclusion
  36. 36. Conclusion Garbage Collector (GC) optimized for high memory traffic + short-lived objects Don’t fear allocations! But beware of gen2 “stop the world” String interning when lots of long-lived, few unique Don’t optimize what should not be optimized… Measure! Using a profiler/memory analysis tool ClrMD to automate inspections dotMemory Unit, Benchmark.NET, … to profile unit tests Blog series: https://blog.maartenballiauw.be
  37. 37. Thank you! http://blog.maartenballiauw.be @maartenballiauw

The .NET Garbage Collector (GC) is really cool. It helps providing our applications with virtually unlimited memory, so we can focus on writing code instead of manually freeing up memory. But how does .NET manage that memory? What are hidden allocations? Are strings evil? It still matters to understand when and where memory is allocated. In this talk, we’ll go over the base concepts of .NET memory management and explore how .NET helps us and how we can help .NET – making our apps better. Expect profiling, Intermediate Language (IL), ClrMD and more!

Views

Total views

443

On Slideshare

0

From embeds

0

Number of embeds

10

Actions

Downloads

9

Shares

0

Comments

0

Likes

0

×