.NET Memory Primer
-
Upload
martin-kulov -
Category
Technology
-
view
472 -
download
2
description
Transcript of .NET Memory Primer
![Page 1: .NET Memory Primer](https://reader033.fdocuments.net/reader033/viewer/2022060110/555c4375d8b42a0b038b4ff9/html5/thumbnails/1.jpg)
.NET Memory Primer
Martin Kulov
![Page 2: .NET Memory Primer](https://reader033.fdocuments.net/reader033/viewer/2022060110/555c4375d8b42a0b038b4ff9/html5/thumbnails/2.jpg)
"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](https://reader033.fdocuments.net/reader033/viewer/2022060110/555c4375d8b42a0b038b4ff9/html5/thumbnails/3.jpg)
• 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](https://reader033.fdocuments.net/reader033/viewer/2022060110/555c4375d8b42a0b038b4ff9/html5/thumbnails/4.jpg)
• x86– 4GB Windows Client, Windows Srv 2008
Standard– 128GB Windows Srv 2003 SP1
Datacenter (PAE)
Physical Memory Limits
![Page 5: .NET Memory Primer](https://reader033.fdocuments.net/reader033/viewer/2022060110/555c4375d8b42a0b038b4ff9/html5/thumbnails/5.jpg)
x86 Memory Mapping
* PFN - Page Frame Number database
![Page 6: .NET Memory Primer](https://reader033.fdocuments.net/reader033/viewer/2022060110/555c4375d8b42a0b038b4ff9/html5/thumbnails/6.jpg)
• x64– 4TB Windows Srv 2012 Standard– per SKU
Physical Memory Limits
![Page 7: .NET Memory Primer](https://reader033.fdocuments.net/reader033/viewer/2022060110/555c4375d8b42a0b038b4ff9/html5/thumbnails/7.jpg)
x64 Memory Mapping (AMD64)
![Page 8: .NET Memory Primer](https://reader033.fdocuments.net/reader033/viewer/2022060110/555c4375d8b42a0b038b4ff9/html5/thumbnails/8.jpg)
Canonical Form Addresses
48-bit implementation
56-bit implementation
64-bit implementation
![Page 9: .NET Memory Primer](https://reader033.fdocuments.net/reader033/viewer/2022060110/555c4375d8b42a0b038b4ff9/html5/thumbnails/9.jpg)
Virtual Address Space
![Page 10: .NET Memory Primer](https://reader033.fdocuments.net/reader033/viewer/2022060110/555c4375d8b42a0b038b4ff9/html5/thumbnails/10.jpg)
• Code• Data• Heaps• Stacks
User Mode Memory
![Page 11: .NET Memory Primer](https://reader033.fdocuments.net/reader033/viewer/2022060110/555c4375d8b42a0b038b4ff9/html5/thumbnails/11.jpg)
• Created for Each Thread• Default to 1MB• Hold Method Data /stack frame/– Parameters– Local variables– Return address
Stacks
![Page 12: .NET Memory Primer](https://reader033.fdocuments.net/reader033/viewer/2022060110/555c4375d8b42a0b038b4ff9/html5/thumbnails/12.jpg)
Stack Layout
![Page 13: .NET Memory Primer](https://reader033.fdocuments.net/reader033/viewer/2022060110/555c4375d8b42a0b038b4ff9/html5/thumbnails/13.jpg)
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](https://reader033.fdocuments.net/reader033/viewer/2022060110/555c4375d8b42a0b038b4ff9/html5/thumbnails/14.jpg)
• Hold Dynamically Allocated Data• Code Heap /JITed code/• Small Object Heap /SOH/• Large Object Heap /LOH/• Process Heap
Heaps
![Page 15: .NET Memory Primer](https://reader033.fdocuments.net/reader033/viewer/2022060110/555c4375d8b42a0b038b4ff9/html5/thumbnails/15.jpg)
• 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](https://reader033.fdocuments.net/reader033/viewer/2022060110/555c4375d8b42a0b038b4ff9/html5/thumbnails/16.jpg)
DEMO: Allocating Memory
![Page 17: .NET Memory Primer](https://reader033.fdocuments.net/reader033/viewer/2022060110/555c4375d8b42a0b038b4ff9/html5/thumbnails/17.jpg)
• 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](https://reader033.fdocuments.net/reader033/viewer/2022060110/555c4375d8b42a0b038b4ff9/html5/thumbnails/18.jpg)
• 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](https://reader033.fdocuments.net/reader033/viewer/2022060110/555c4375d8b42a0b038b4ff9/html5/thumbnails/19.jpg)
• Contiguous Memory Areas• Ephemeral Segment– Holds Gen0, Gen1– There Can Be Only One
• Gen2 Segments
Segments
![Page 20: .NET Memory Primer](https://reader033.fdocuments.net/reader033/viewer/2022060110/555c4375d8b42a0b038b4ff9/html5/thumbnails/20.jpg)
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](https://reader033.fdocuments.net/reader033/viewer/2022060110/555c4375d8b42a0b038b4ff9/html5/thumbnails/21.jpg)
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](https://reader033.fdocuments.net/reader033/viewer/2022060110/555c4375d8b42a0b038b4ff9/html5/thumbnails/22.jpg)
Collection - When
• Gen0 is Full• Induced GC /System.GC.Collect()/• System Pressure
![Page 23: .NET Memory Primer](https://reader033.fdocuments.net/reader033/viewer/2022060110/555c4375d8b42a0b038b4ff9/html5/thumbnails/23.jpg)
DEMO: Collecting Memory
![Page 24: .NET Memory Primer](https://reader033.fdocuments.net/reader033/viewer/2022060110/555c4375d8b42a0b038b4ff9/html5/thumbnails/24.jpg)
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](https://reader033.fdocuments.net/reader033/viewer/2022060110/555c4375d8b42a0b038b4ff9/html5/thumbnails/25.jpg)
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](https://reader033.fdocuments.net/reader033/viewer/2022060110/555c4375d8b42a0b038b4ff9/html5/thumbnails/26.jpg)
Collection - How
• Suspend Managed Threads• Collect Garbage• Resume Managed Threads• Two Phases of GC–Mark– Compact
![Page 27: .NET Memory Primer](https://reader033.fdocuments.net/reader033/viewer/2022060110/555c4375d8b42a0b038b4ff9/html5/thumbnails/27.jpg)
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](https://reader033.fdocuments.net/reader033/viewer/2022060110/555c4375d8b42a0b038b4ff9/html5/thumbnails/28.jpg)
Workstation GC – Non Concurrent
![Page 29: .NET Memory Primer](https://reader033.fdocuments.net/reader033/viewer/2022060110/555c4375d8b42a0b038b4ff9/html5/thumbnails/29.jpg)
Server GC – Non Concurrent
![Page 30: .NET Memory Primer](https://reader033.fdocuments.net/reader033/viewer/2022060110/555c4375d8b42a0b038b4ff9/html5/thumbnails/30.jpg)
Workstation GC - Concurrent
![Page 31: .NET Memory Primer](https://reader033.fdocuments.net/reader033/viewer/2022060110/555c4375d8b42a0b038b4ff9/html5/thumbnails/31.jpg)
Workstation GC - Background
![Page 32: .NET Memory Primer](https://reader033.fdocuments.net/reader033/viewer/2022060110/555c4375d8b42a0b038b4ff9/html5/thumbnails/32.jpg)
Server GC - Background
![Page 33: .NET Memory Primer](https://reader033.fdocuments.net/reader033/viewer/2022060110/555c4375d8b42a0b038b4ff9/html5/thumbnails/33.jpg)
Server GC – Before and After
![Page 34: .NET Memory Primer](https://reader033.fdocuments.net/reader033/viewer/2022060110/555c4375d8b42a0b038b4ff9/html5/thumbnails/34.jpg)
Testing Server GC
![Page 35: .NET Memory Primer](https://reader033.fdocuments.net/reader033/viewer/2022060110/555c4375d8b42a0b038b4ff9/html5/thumbnails/35.jpg)
New in .NET 4.5.1 RC
• LOH Compacting!GCSettings.LargeObjectHeapCompactionMode =
GCLargeObjectHeapCompactionMode.CompactOnce;
GC.Collect();
![Page 36: .NET Memory Primer](https://reader033.fdocuments.net/reader033/viewer/2022060110/555c4375d8b42a0b038b4ff9/html5/thumbnails/36.jpg)
• Very Fast Allocation• Automatic GC• Nondeterministic Finalization• Finalizers and Finalization Queue• Deterministic Finalization - IDisposable
Resource Management
![Page 37: .NET Memory Primer](https://reader033.fdocuments.net/reader033/viewer/2022060110/555c4375d8b42a0b038b4ff9/html5/thumbnails/37.jpg)
CHALLENGE: Implement Dispose Pattern/ Volunteer is Needed /