Check out the new USENIX Web site.

Handling object initializers and static methods

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