Etienne Gagnon wrote: > "Revival" is only needed if you use the finalization-like approach. If > you only do class-unloading GC when the nursery is empty, then no > revival is needed.
Ah, I think I got it. You mean running a minor collection, and then "class unloading" full heap collection sequentially, without any mutator work in between? Then, the correctness is observed easily: 1) all mature objects has their vtable marks set to 1 2) after minor collection, the nursery is empty => all live objects already have vtable marks == 1 Thus, if we find a classloader with vtable marks == 0, then it has no object instances, and its reachability is defined solely by reachability of java.lang.ClassLoader instance and existence of the method frames, which can be checked, respectively, by enumerating class loader roots as weak roots, and scanning stacks. Note, that the class loader, which became eligible for unloading during epoch N, will not be unloaded until the end of the epoch N+1. However, in the case of non-generational collector, the "minor collection followed by unloading collection" becomes effectively two successive garbage collections. On the other side, "finalization-like" design goes as follows: 1) clean vtable marks before "class unloading" collection 2) enumerate classloader roots as weak and collect array of user classloader pointers for later use -- let's call it "unload list" 3) trace the heap 4) scan vtable marks and "revive" marked class unloaders, by adding the strong root from the previously collected "unload list". Remove the revived classloaders from unload list. 5) repeat steps (3) and (4) until there is no classloaders to revive 6) unload the classloaders, pointed by the "unload list" -- this reclaims native resources 7) let the GC finish collection and reclaim unreachable objects -- this reclaims java objects This design unloads classloaders at the end of the very same epoch when they became unloadable. The voting definitely was premature, as it turns out that even the design under discussion can be elaborated to multiple substantially different designs.