Le 30/07/2010 21:59, Mandy Chung a écrit :
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
There is a big diff (at least on linux) if you just try to print the
help of the VM,
i.e pass no argument.
jdk1.6.0_21: 274 classes
jdk1.7.0b103: 364 classes
I join the diff.
Some classes of java.text.*, java.util.ResourceBundle* and
some classes related to locale and currency are loaded eagerly.
Rémi
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 <[email protected]>:
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
--- /tmp/jdk6.txt 2010-07-31 22:12:20.000000000 +0200
+++ /tmp/jdk7.txt 2010-07-31 22:12:33.000000000 +0200
@@ -3,12 +3,16 @@
java.io.BufferedReader
java.io.BufferedWriter
java.io.Closeable
+java.io.DataInput
+java.io.DataInputStream
java.io.ExpiringCache
java.io.ExpiringCache$1
java.io.ExpiringCache$Entry
java.io.File
java.io.FileDescriptor
+java.io.FileDescriptor$1
java.io.FileInputStream
+java.io.FileNotFoundException
java.io.FileOutputStream
java.io.FileReader
java.io.FileSystem
@@ -18,7 +22,6 @@
java.io.InputStream
java.io.InputStreamReader
java.io.IOException
-java.io.ObjectStreamClass
java.io.ObjectStreamField
java.io.OutputStream
java.io.OutputStreamWriter
@@ -31,33 +34,36 @@
java.lang.Appendable
java.lang.ArithmeticException
java.lang.ArrayStoreException
-java.lang.AssertionStatusDirectives
+java.lang.AutoCloseable
java.lang.Boolean
java.lang.Byte
java.lang.Character
+java.lang.CharacterData
java.lang.CharacterDataLatin1
java.lang.CharSequence
java.lang.Class
java.lang.Class$1
java.lang.Class$3
java.lang.ClassCastException
-java.lang.ClassFormatError
java.lang.ClassLoader
+java.lang.ClassLoader$2
java.lang.ClassLoader$3
java.lang.ClassLoader$NativeLibrary
+java.lang.ClassLoader$ParallelLoaders
java.lang.ClassNotFoundException
java.lang.Cloneable
java.lang.Comparable
java.lang.Compiler
java.lang.Compiler$1
java.lang.Double
+java.lang.Enum
java.lang.Error
java.lang.Exception
java.lang.Float
-java.lang.IllegalArgumentException
java.lang.IllegalMonitorStateException
java.lang.IncompatibleClassChangeError
java.lang.Integer
+java.lang.Integer$IntegerCache
java.lang.Iterable
java.lang.LinkageError
java.lang.Long
@@ -68,7 +74,6 @@
java.lang.Number
java.lang.Object
java.lang.OutOfMemoryError
-java.lang.Package
java.lang.Readable
java.lang.ref.Finalizer
java.lang.ref.Finalizer$FinalizerThread
@@ -79,6 +84,7 @@
java.lang.reflect.Constructor
java.lang.reflect.Field
java.lang.reflect.GenericDeclaration
+java.lang.ReflectiveOperationException
java.lang.reflect.Member
java.lang.reflect.Method
java.lang.reflect.Modifier
@@ -110,7 +116,6 @@
java.lang.StringCoding
java.lang.StringCoding$StringDecoder
java.lang.StringCoding$StringEncoder
-java.lang.StringValue
java.lang.System
java.lang.System$2
java.lang.SystemClassLoaderAction
@@ -125,14 +130,19 @@
java.lang.Thread$UncaughtExceptionHandler
java.lang.Throwable
java.lang.VirtualMachineError
-java.lang.Void
+java.math.RoundingMode
java.net.Parts
java.net.URL
java.net.URLClassLoader
+java.net.URLClassLoader$1
+java.net.URLClassLoader$2
+java.net.URLClassLoader$3
+java.net.URLClassLoader$3$1
java.net.URLClassLoader$7
java.net.URLStreamHandler
java.net.URLStreamHandlerFactory
java.nio.Bits
+java.nio.Bits$1
java.nio.Buffer
java.nio.ByteBuffer
java.nio.ByteOrder
@@ -155,25 +165,49 @@
java.security.CodeSource
java.security.Guard
java.security.Permission
-java.security.PermissionCollection
+java.security.Principal
java.security.PrivilegedAction
+java.security.PrivilegedActionException
java.security.PrivilegedExceptionAction
java.security.ProtectionDomain
+java.security.ProtectionDomain$2
+java.security.ProtectionDomain$Key
java.security.SecureClassLoader
+java.text.AttributedCharacterIterator$Attribute
+java.text.DecimalFormat
+java.text.DecimalFormatSymbols
+java.text.DigitList
+java.text.FieldPosition
+java.text.FieldPosition$Delegate
+java.text.Format
+java.text.Format$Field
+java.text.Format$FieldDelegate
+java.text.MessageFormat
+java.text.MessageFormat$Field
+java.text.NumberFormat
+java.text.NumberFormat$Field
+java.text.spi.DecimalFormatSymbolsProvider
+java.text.spi.NumberFormatProvider
java.util.AbstractCollection
java.util.AbstractList
java.util.AbstractMap
java.util.AbstractSet
java.util.ArrayList
+java.util.ArrayList$Itr
java.util.Arrays
+java.util.Arrays$ArrayList
java.util.BitSet
java.util.Collection
java.util.Collections
java.util.Collections$EmptyList
java.util.Collections$EmptyMap
java.util.Collections$EmptySet
-java.util.Collections$ReverseComparator
-java.util.Collections$SynchronizedMap
+java.util.Collections$SetFromMap
+java.util.Collections$SynchronizedCollection
+java.util.Collections$SynchronizedSet
+java.util.Collections$UnmodifiableCollection
+java.util.Collections$UnmodifiableList
+java.util.Collections$UnmodifiableRandomAccessList
java.util.Comparator
java.util.concurrent.atomic.AtomicInteger
java.util.concurrent.atomic.AtomicReferenceFieldUpdater
@@ -189,36 +223,69 @@
java.util.concurrent.locks.ReentrantLock
java.util.concurrent.locks.ReentrantLock$NonfairSync
java.util.concurrent.locks.ReentrantLock$Sync
+java.util.Currency
+java.util.Currency$1
+java.util.Date
java.util.Dictionary
java.util.Enumeration
java.util.HashMap
java.util.HashMap$Entry
+java.util.HashMap$EntryIterator
+java.util.HashMap$EntrySet
+java.util.HashMap$HashIterator
java.util.HashSet
java.util.Hashtable
-java.util.Hashtable$EmptyEnumerator
-java.util.Hashtable$EmptyIterator
java.util.Hashtable$Entry
java.util.Iterator
java.util.LinkedHashMap
java.util.LinkedHashMap$Entry
+java.util.LinkedHashMap$EntryIterator
+java.util.LinkedHashMap$LinkedHashIterator
+java.util.LinkedHashSet
java.util.List
+java.util.ListResourceBundle
java.util.Locale
java.util.Map
java.util.Map$Entry
java.util.Properties
java.util.RandomAccess
+java.util.ResourceBundle
+java.util.ResourceBundle$1
+java.util.ResourceBundle$BundleReference
+java.util.ResourceBundle$CacheKey
+java.util.ResourceBundle$CacheKeyReference
+java.util.ResourceBundle$Control
+java.util.ResourceBundle$Control$1
+java.util.ResourceBundle$LoaderReference
+java.util.ResourceBundle$RBClassLoader
+java.util.ResourceBundle$RBClassLoader$1
+java.util.ResourceBundle$SingleFormatControl
+java.util.ServiceLoader
+java.util.ServiceLoader$1
+java.util.ServiceLoader$LazyIterator
java.util.Set
+java.util.spi.CurrencyNameProvider
+java.util.spi.LocaleServiceProvider
java.util.Stack
java.util.StringTokenizer
java.util.Vector
-sun.jkernel.DownloadManager
-sun.jkernel.DownloadManager$1
-sun.jkernel.DownloadManager$2
-sun.misc.AtomicLong
-sun.misc.AtomicLongCSImpl
+java.util.WeakHashMap
+java.util.WeakHashMap$Entry
+java.util.WeakHashMap$KeySet
+sun.launcher.LauncherHelper
+sun.launcher.resources.launcher
+sun.launcher.resources.launcher_fr
+sun.misc.BootClassLoaderHook
+sun.misc.CompoundEnumeration
+sun.misc.FileURLMapper
+sun.misc.JavaIOFileDescriptorAccess
sun.misc.JavaLangAccess
sun.misc.JavaNetAccess
+sun.misc.JavaNioAccess
+sun.misc.JavaSecurityProtectionDomainAccess
sun.misc.Launcher
+sun.misc.Launcher$1
+sun.misc.Launcher$2
sun.misc.Launcher$AppClassLoader
sun.misc.Launcher$AppClassLoader$1
sun.misc.Launcher$ExtClassLoader
@@ -230,14 +297,23 @@
sun.misc.SharedSecrets
sun.misc.Signal
sun.misc.SignalHandler
-sun.misc.SoftCache
sun.misc.Unsafe
sun.misc.URLClassPath
+sun.misc.URLClassPath$1
+sun.misc.URLClassPath$2
+sun.misc.URLClassPath$3
+sun.misc.URLClassPath$FileLoader
+sun.misc.URLClassPath$JarLoader
+sun.misc.URLClassPath$JarLoader$1
+sun.misc.URLClassPath$Loader
sun.misc.Version
sun.misc.VM
+sun.net.util.URLUtil
sun.net.www.ParseUtil
sun.net.www.protocol.file.Handler
sun.net.www.protocol.jar.Handler
+sun.nio.cs.ArrayDecoder
+sun.nio.cs.ArrayEncoder
sun.nio.cs.FastCharsetProvider
sun.nio.cs.HistoricallyNamedCharset
sun.nio.cs.StandardCharsets
@@ -271,4 +347,18 @@
sun.reflect.UnsafeStaticFieldAccessorImpl
sun.security.action.GetPropertyAction
sun.security.util.Debug
+sun.text.resources.FormatData
+sun.text.resources.FormatData_fr
+sun.text.resources.FormatData_fr_FR
+sun.util.LocaleDataMetaInfo
+sun.util.LocaleServiceProviderPool
+sun.util.LocaleServiceProviderPool$1
sun.util.PreHashedMap
+sun.util.resources.CurrencyNames
+sun.util.resources.CurrencyNames_fr
+sun.util.resources.CurrencyNames_fr_FR
+sun.util.resources.LocaleData
+sun.util.resources.LocaleData$1
+sun.util.resources.LocaleData$LocaleDataResourceBundleControl
+sun.util.resources.LocaleNamesBundle
+sun.util.resources.OpenListResourceBundle