Referenced-typed objects in an application have different lifetimes. The application will use some objects as long as the application is running. Others are referenced only during execution of a single method.

If the garbage collector always examined every object whenever it did a garbage collection pass, it would spend a lot of time reexamining longer-living objects that can’t yet be garbage collected. The garbage collector can perform more efficiently by looking at only a subset of all objects during each pass. It does this by grouping objects into generations:

Generation 0 – Objects that have been created since the last GC pass (newest objects)

Generation 1 – Objects that have survived one pass of the GC

Generation 2 – All other objects (oldest objects)

The garbage collector examines and collect objects in generation 0, moving to higher generations only if it needs additional memory.

Objects are promoted to the next generation only if a GC pass is done on the generation in which they are located.