jvm load too many classes

David Holmes David.Holmes at oracle.com
Sat Jul 31 06:03:57 UTC 2010


<dropping hotspot-dev from the cc list>

Did you try the same test on a regular JDK platform? This is likely due 
to changes in the class libraries. Such a change might be very 
noticeable for a "no-op" test (ie not running any application class) but 
may not be so significant for an actual test case.

For example, if you do "java Foo" (where there is no class Foo) in 1.5 
you get a single println:

Exception in thread "main" java.lang.NoClassDefFoundError: Foo

whereas in 1.6 and JDK 7 you will get a stack dump from the exception:

Exception in thread "main" java.lang.NoClassDefFoundError: Foo
Caused by: java.lang.ClassNotFoundException: Foo
         at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
         at java.security.AccessController.doPrivileged(Native Method)
         at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
         at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
         at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
         at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
Could not find the main class: Foo.  Program will exit.

This might require loading many additional I/O and character set related 
classes. Just a hypothesis - I haven't checked it.

David Holmes
------------

Yongqiang Yang said the following on 07/31/10 15:48:
> I am porting openjdk1.6 to MIPS. I have finished, but opendk1.6 is four 
> times slower  than jdk1.5 at startup.   Two versions ran on the same 
> MIPS  machine .
>  
> During startup, openjdk1.6 runs 1,650,000 bytecodes while jdk1.5 runs 
> about 240,000 bytecodes.
> 
> On Sat, Jul 31, 2010 at 3:59 AM, Mandy Chung <mandy.chung at oracle.com 
> <mailto:mandy.chung at oracle.com>> wrote:
> 
>     Osvaldo Doederlein wrote:
> 
>         I wonder if these numbers have some variation per platform?
> 
> 
>     Yes, there are some platform-dependent classes and so some loaded
>     classes are different on different platform.
> 
> 
>         For me (on
>         Windows; 32-bit JDKs), the results of this test (java
>         -verbose:class |
>         grep Loaded | wc -l) are:
> 
>         1.5.0_22: 239
>         1.6.0_21: 274
>         1.7.0-ea-b103: 403
> 
>          
> 
>     I ran the helloworld. The number of loaded classes running different jdk
>     versions are fairly close.  What test case did you use?
> 
>     $ grep Loaded hw.verbose.jdk5u22 | wc -l
>     303
> 
>     $ grep Loaded hw.verbose.jdk6u21 | wc -l
>     323
> 
>     $ grep Loaded hw.verbose.jdk7 | wc -l
>     329
> 
> 
> 
>         The diff from 1.5 to 1.6 is not bad, but JDK7 seems right now to
>         be a
>         heavy regression... FWIW for such a simple test. For one thing,
>         these
>         core-boot classes all come off the CDS file so their classloading
>         effort is relatively very small, and the delta will certainly be
>         much
>         smaller for even the smallest real-world app.
>          
> 
>     Right.  -verbose:class prints out all loaded classes regardless of
>     coming from CDS archive or not. The number of loaded classes is one
>     metric to the startup while class loading time + clinit time are
>     other important metrics.  So these loaded classes has small impact
>     to the startup time especially with CDS is enabled.
> 
>     Mandy
> 
> 
>         A+
>         Osvaldo
> 
>         2010/7/30 Mandy Chung <mandy.chung at oracle.com
>         <mailto:mandy.chung at oracle.com>>:
>          
> 
>             Yongqiang Yang wrote:
>                
> 
>                 hi,
> 
>                    I just type command "java" under openjdk1.6, then the
>                 jvm will load
>                 308 classes, including            
>                 java/launcher/LauncherHelp,
>                           java/util/ResourceBundle,
>                           java/util/Currency,
>                           java/util/Locale,
>                           java/net/URL
> 
>                       When I use jdk1.5, the jvm just load about 180
>                 classes, not
>                 including the classes above.
> 
>                       Could someone figure out something wrong?
>                      
> 
>             New features and bug fixes in a new release could lead to
>             more classes get
>             loaded at startup.  We have done some work to lazily load
>             classes if
>             appropriate (see CR 6798873: Reduce the number of classes
>             loaded and class
>             dependencies).
> 
>             Mandy
> 
> 
>                
> 
> 
> 
> 
> 
> -- 
> Best Wishes
> Yongqiang Yang
> 



More information about the core-libs-dev mailing list