Because there are many object initializers that share a common name
init and descriptor, their CTB arrays may
grow too large if we allocate CTB slots using the name and descriptor
as index. Since calls of object initializers and static methods are
monomorphic, the allocation of CTB slots for each method is
independent of other methods with the same name and descriptor. For
example, static methods A.m() and B.m() both can use the
same CTB index for different callers. Therefore, there is no
superfluous space in CTB arrays of object initializers and static
methods. For unresolved static or object initializer method
references, a dependency on the reference from the caller is
registered in a database. When the method reference gets resolved
(this happens due to a class loading event), the dependency is
converted to a call edge conservatively. Using the _213_javac
benchmark as example, we found this conservativeness only adds
1.5% more edges.
Feng Qian
2004-02-16