Hello, MadHuman, you wrote: m2l>> it is formal does not contradict the standard. To forgive and correct the test. MH> I see the following contradiction - object references more are not present, G.Collect collects all garbage in all generations (according to the documentation). MH> that is our object there was garbage, but declared behavior G.Collect, it has not been collected. MH> that is the behavior contradicts declared behavior G.Collect Your example a bit incorrect without WaitForPendingFinalizers - as a variant, at multi-threaded garbage collection GC could place object in queue for removal of other flow, and there had not time to cause Finalize to your the second IsAlive. If to approach to method Collect it is very formal - you do not have "open" warranties between language, IL, JIT, CLR. For example to an output from area of visibility JIT can clamp the link or GC to consider that it is "almost root object or still something similar. GC.Collect Guarantees check of all objects and collection leaked, and the assembly from them, only on whom there are no links. But, note, not the assembly of all objects on which there are no links. And not the assembly of all objects quitted area of visibility of contexts of execution of a source language of programming. And still described by you an example something very much bears a faint resemblance to a specification example. Ecma-334 8.9 Automatic memory management, the last piece of the code and an explanation under it of availability of an object reference after GC. Probably at you similar effects?