- GC stores new objects in generation 0 until there is no more space.
- The GC performs a collection when generation 0 is full.
- This collection of generation 0 compacts the memory for the reachable objects.
- The garbage collector then promotes these objects from generation 0 to 1 and it considers the remainder of the managed heap generation 0.
- GC considers this new portion of the managed heap generation 1.
- Again It continues to allocate memory for new objects in generation 0 until generation 0 is full and it is necessary to perform another collection.
- Now in later stage of allocations, For example, if a collection of generation 0 does not reclaim enough memory for the application to successfully complete its attempt to create a new object, the GC can perform a collection of generation 1, then generation 0.
- If this does not reclaim enough memory, the GC can perform a collection of generations 2, 1, and 0.
- Because the garbage collector supports only three generations, objects in generation 2 that survives remain in generation 2 only, until they are determined to be unreachable in a future collection. i.e When the collection of generation 2 happens, the reachable objects in generation 2 remains there only, and not shifted to any other generations. And the Unreachable object are thrown away from the heap.
- Because objects that survive collections tend to have longer lifetimes, it makes sense to promote them to a higher generation. As a result, the garbage collector does not have to reexamine the objects in generations 1 and 2 each time it performs a collection of generation 0.
- This is the most efficient approach, because new objects tend to have short lifetimes, and it is expected that many of the objects in generation 0 will no longer be in use by the application when a collection is performed.
Hope it is clear now.