Egor, I would rather disagree in most of the details. :(
1) "1/10 of the whole heap is probably very much :)" No. You can't measure performance in method/class numbers and proportions at all. It's normal situation when only 1% of methods consume 90% of CPU ticks. Not all of them depends on devirtualization or classes unloaded. So you can't say that 1 class unloaded is OK but 100% is bad. It's a lottery. 2) "hm, keeping VTable pointers on operands (and reporting them in root sets) solves the problem. That slightly increases register pressure, but I think is a better solution than pinning VTables (and rather straightforward)." The Alexey's solution does not affect devirtualizer at all. Unpinning vtables you have to include them into enumeration. I'm not sure that moving vtables to opnds as object-type is a simple task and think that it l will affect GC-enumeration part in JIT too. Another cons: type profiling we will have soon. You have to include it into enumeration. -- Mikhail Fursov