why is VM calling ClassLoader.loadClassInternal
David Holmes - Sun Microsystems
David.Holmes at Sun.COM
Wed Aug 29 02:03:06 PDT 2007
Christian,
The "magic" is that loadClassInternal is synchronized.
There's a very long and checkered history here. When the classloader
architecture was re-worked in JDK 1.2 they should have made certain
methods, like loadClass, final. But compatibility said they couldn't do
that and instead it is recommended that loadClass not be overridden but
instead findClass is overridden. This means the VM can't make
assumptions about whether a classLoader correctly protects itself
against concurrent loading. Hence loadClassInternal was made the private
upcall made by the VM, so at least it was known that the call was
synchronized.
For "well-behaved" classloaders that follow the delegation model
correctly this works fine. For classloaders that don't do that ... well
you'll see some very ugly and inexplicable code in there to try and
accommodate them.
The classloader architecture is being re-visited for Java 7, in part to
allow more flexible delegation structures that are anticipated for the
Java module system (JSR 277) and superpackages (JSR 294).
Cheers,
David Holmes
Christian Thalinger said the following on 29/08/07 06:29 PM:
> Hi!
>
> Can someone tell me why HotSpot calls ClassLoader.loadClassInternal
> instead of loadClass directly? There's no magic in that method:
>
> // This method is invoked by the virtual machine to load a class.
> private synchronized Class loadClassInternal(String name)
> throws ClassNotFoundException
> {
> return loadClass(name);
> }
>
> Some magic hiden in HotSpot?
>
> - twisti
>
More information about the hotspot-runtime-dev
mailing list