net memory primer

38
.NET Memory Primer Martin Kulov

Upload: martin-kulov

Post on 20-May-2015

465 views

Category:

Technology


2 download

DESCRIPTION

The understanding of .NET Memory Management goes from the basics of how Windows memory works to the physical memory layout and allocation. This presentations covers both using Visual Studio IDE as main workplace.

TRANSCRIPT

Page 1: NET Memory Primer

.NET Memory Primer

Martin Kulov

Page 2: NET Memory Primer

"Out of CPU, memory and disk, memory is typically the most important for overall system performance."

 Mark Russinovich

“All you worry about in a .NET application is the memory.”

John Robbins

Page 3: NET Memory Primer

• x86– 2 ^ 32 bits = 4GB /0x FFFF FFFF/

• x64– 2 ^ 64 bits = 16 EB /0x FFFF FFFF' FFFF

FFFF/

Addressing Limits /Virtual Limits/

Page 4: NET Memory Primer

• x86– 4GB Windows Client, Windows Srv 2008

Standard– 128GB Windows Srv 2003 SP1

Datacenter (PAE)

Physical Memory Limits

Page 5: NET Memory Primer

x86 Memory Mapping

* PFN - Page Frame Number database

Page 6: NET Memory Primer

• x64– 4TB Windows Srv 2012 Standard– per SKU

Physical Memory Limits

Page 7: NET Memory Primer

x64 Memory Mapping (AMD64)

Page 8: NET Memory Primer

Canonical Form Addresses

48-bit implementation

56-bit implementation

64-bit implementation

Page 9: NET Memory Primer

Virtual Address Space

Page 10: NET Memory Primer

• Code• Data• Heaps• Stacks

User Mode Memory

Page 11: NET Memory Primer

• Created for Each Thread• Default to 1MB• Hold Method Data /stack frame/– Parameters– Local variables– Return address

Stacks

Page 12: NET Memory Primer

Stack Layout

Page 13: NET Memory Primer

ChildEBP RetAddr Caller,Callee08e4e1a4 751b149d _WaitForSingleObjectEx@12+0x98, calling _ZwWaitForSingleObject@1208e4e1e8 718b53c2 ?LeaveRuntimeNoThrow@Thread@@SGJI@Z+0xd7, calling __EH_epilog308e4e210 755b1194 _WaitForSingleObjectExImplementation@12+0x75, calling _WaitForSingleObjectEx@1208e4e228 718b54d7 ?LoadImage@PEImage@@SGPAV1@PAUHINSTANCE__@@@Z+0x1af...08e4f5f4 71a10647 ?intermediateThreadProc@Thread@@CGKPAX@Z+0x4908e4f784 71a10635 ?intermediateThreadProc@Thread@@CGKPAX@Z+0x37, calling __alloca_probe_1608e4f798 755b336a @BaseThreadInitThunk@12+0xe08e4f7a4 77639f72 ___RtlUserThreadStart@8+0x7008e4f7e4 77639f45 __RtlUserThreadStart@8+0x1b, calling ___RtlUserThreadStart@8

Call Stack Example

Page 14: NET Memory Primer

• Hold Dynamically Allocated Data• Code Heap /JITed code/• Small Object Heap /SOH/• Large Object Heap /LOH/• Process Heap

Heaps

Page 15: NET Memory Primer

• Stack– Value Types /Int32, Bool, Struct, etc…/– Pointers to Reference Types

• Heap– Reference Types /Object, String, Array,

etc…/– Free Areas

Allocating .NET Memory

Page 16: NET Memory Primer

DEMO: Allocating Memory

Page 17: NET Memory Primer

• Stack References• Static References /Fields,

ThreadStatic/• CPU Registers• Interop References /COM, API calls/• Finalization Queue References

Object Roots /GC Roots/

Page 18: NET Memory Primer

• a.k.a. Generational Garbage Collector /GC/

• Three Generations /SOH/– Gen0 – short lived– Gen1 – medium lived– Gen2 – long lived

Nondeterministic Finalization

Page 19: NET Memory Primer

• Contiguous Memory Areas• Ephemeral Segment– Holds Gen0, Gen1– There Can Be Only One

• Gen2 Segments

Segments

Page 20: NET Memory Primer

Before GC #1Gen1 Gen0

Before GC #500Gen2

Gen2

Gen2 Gen1 Gen0

Gen0Before GC #0

Before GC #2

Gen2 Gen1 Gen0

Before GC #100Gen2

Gen2 Gen1 Gen0

Page 21: NET Memory Primer

Allocation - Cost

• Cheap Lock on UP; Lock Free on MP• Moving a Pointer Forward• Clearing the Memory for New Objects• Register for Finalization if Applicable• Object Proximity

Page 22: NET Memory Primer

Collection - When

• Gen0 is Full• Induced GC /System.GC.Collect()/• System Pressure

Page 23: NET Memory Primer

DEMO: Collecting Memory

Page 24: NET Memory Primer

Collection - Cost

• Rule of Thumb – Ratio 1:10:100• .NET CLR Memory\% time in GC• .NET CLR Memory\# Induced GC• .NET CLR Memory\# Gen X

collections

Page 25: NET Memory Primer

Large Object Heap• > 85KB /or >1,000 doubles/• Memory is Swept During Gen2

/Marked as Free/• Avoid Temporary Large Objects in LOH• Reuse Objects in LOH If Possible• Many LOH Segments• Fragmentation Problems

Page 26: NET Memory Primer

Collection - How

• Suspend Managed Threads• Collect Garbage• Resume Managed Threads• Two Phases of GC–Mark– Compact

Page 27: NET Memory Primer

GC Types

• Workstation GC – Non Concurrent• Server GC – Non Concurrent• Workstation GC – Concurrent – Background GC /New in .NET 4/

• Server GC – Background /New in .NET 4.5/

Page 28: NET Memory Primer

Workstation GC – Non Concurrent

Page 29: NET Memory Primer

Server GC – Non Concurrent

Page 30: NET Memory Primer

Workstation GC - Concurrent

Page 31: NET Memory Primer

Workstation GC - Background

Page 32: NET Memory Primer

Server GC - Background

Page 33: NET Memory Primer

Server GC – Before and After

Page 34: NET Memory Primer

Testing Server GC

Page 35: NET Memory Primer

New in .NET 4.5.1 RC

• LOH Compacting!GCSettings.LargeObjectHeapCompactionMode =

GCLargeObjectHeapCompactionMode.CompactOnce;

GC.Collect();

Page 36: NET Memory Primer

• Very Fast Allocation• Automatic GC• Nondeterministic Finalization• Finalizers and Finalization Queue• Deterministic Finalization - IDisposable

Resource Management

Page 37: NET Memory Primer

CHALLENGE: Implement Dispose Pattern/ Volunteer is Needed /

Page 38: NET Memory Primer

Thank you!@kulov

blog.kulov.net

www.linkedin.com/in/kulov

[email protected]