42
42
43
43
namespace CodeSamples . Useful
44
44
{
45
- public class GarbageCollectionSample : SampleExecute
45
+ internal class GarbageCollectionInfo
46
+ {
47
+ public int MaxGeneration { get ; private set ; }
48
+
49
+ public int Generation0 { get ; private set ; }
50
+ public int Generation1 { get ; private set ; }
51
+ public int Generation2 { get ; private set ; }
52
+
53
+ public long TotalMemory { get ; private set ; }
54
+
55
+ public GarbageCollectionInfo ( )
56
+ {
57
+ MaxGeneration = GC . MaxGeneration ;
58
+
59
+ Generation0 = GC . CollectionCount ( 0 ) ;
60
+ Generation1 = GC . CollectionCount ( 1 ) ;
61
+ Generation2 = GC . CollectionCount ( 2 ) ;
62
+
63
+ TotalMemory = GC . GetTotalMemory ( false ) ;
64
+ }
65
+
66
+ public override string ToString ( )
67
+ {
68
+ return $ "GC Info: MaxGen={ MaxGeneration } , Gen0={ Generation0 } , Gen1={ Generation1 } , Gen2={ Generation2 } , Total Memory={ TotalMemory } ";
69
+ }
70
+ }
71
+
72
+ internal class GarbageCollection
46
73
{
74
+ #pragma warning disable S1481
75
+ private void MakeSomeGarbage ( )
76
+ {
77
+ Console . WriteLine ( "Making Garbage..." ) ;
78
+ for ( int i = 0 ; i < 5000 ; i ++ )
79
+ {
80
+ var version = new Version ( ) ;
81
+ }
82
+ }
83
+ #pragma warning restore S1481
84
+
85
+ #pragma warning disable S1215
86
+ private void ForceGarbageCollection ( )
87
+ {
88
+ var gc = new GarbageCollection ( ) ;
89
+
90
+ var gcBefore = new GarbageCollectionInfo ( ) ;
91
+ Console . WriteLine ( $ "Before Garbage Collection: { gcBefore } ") ;
92
+ gc . MakeSomeGarbage ( ) ;
93
+ var gcAfterGeneratingGarbage = new GarbageCollectionInfo ( ) ;
94
+ Console . WriteLine ( $ "After Generating Garbage: { gcAfterGeneratingGarbage } ") ;
95
+
96
+ GC . Collect ( 0 ) ;
97
+ var gcAfterCleanupGen0 = new GarbageCollectionInfo ( ) ;
98
+ Console . WriteLine ( $ "After Garbage Collection of Gen0: { gcAfterCleanupGen0 } ") ;
99
+
100
+ GC . Collect ( 1 ) ;
101
+ var gcAfterCleanupGen1 = new GarbageCollectionInfo ( ) ;
102
+ Console . WriteLine ( $ "After Garbage Collection of Gen1: { gcAfterCleanupGen1 } ") ;
103
+
104
+ GC . WaitForPendingFinalizers ( ) ;
105
+ GC . Collect ( 2 ) ;
106
+
107
+ var gcAfterCleanupGen2 = new GarbageCollectionInfo ( ) ;
108
+ Console . WriteLine ( $ "After Garbage Collection of Gen2: { gcAfterCleanupGen2 } ") ;
109
+
110
+ GC . WaitForPendingFinalizers ( ) ;
111
+ GC . Collect ( ) ;
112
+
113
+ var gcAfterCleanup = new GarbageCollectionInfo ( ) ;
114
+ Console . WriteLine ( $ "After Garbage Collection: { gcAfterCleanup } ") ;
115
+ }
116
+ #pragma warning restore S1215
117
+
47
118
private void TurnGarbageCollectionOff ( )
48
119
{
49
120
Console . Write ( "Turning Garbage Collection into low latency (= off)..." ) ;
@@ -58,13 +129,25 @@ private void TurnGarbageCollectionOn()
58
129
Console . WriteLine ( "done!" ) ;
59
130
}
60
131
61
- public override void Execute ( )
132
+ public void Go ( )
62
133
{
63
- Title ( "GarbageCollectionSample" ) ;
64
134
TurnGarbageCollectionOff ( ) ;
65
135
Thread . Sleep ( 1000 ) ;
66
136
TurnGarbageCollectionOn ( ) ;
67
137
138
+ ForceGarbageCollection ( ) ;
139
+ }
140
+ }
141
+
142
+ public class GarbageCollectionSample : SampleExecute
143
+ {
144
+ public override void Execute ( )
145
+ {
146
+ Title ( "GarbageCollectionSample" ) ;
147
+
148
+ var garbageCollection = new GarbageCollection ( ) ;
149
+ garbageCollection . Go ( ) ;
150
+
68
151
Finish ( ) ;
69
152
}
70
153
}
0 commit comments