RFR (S): 8213439: Run class initialization for boot loader classes with registered subgraph archiving entry field during CDS dump time

Jiangli Zhou jiangli.zhou at oracle.com
Thu Nov 8 02:29:25 UTC 2018


Hi David,


On 11/7/18 5:49 PM, David Holmes wrote:
> Hi Jiangli,
>
> On 8/11/2018 11:25 AM, Jiangli Zhou wrote:
>> Hi David,
>>
>> Attached are two logs for class initialization:
>>
>>    init_nodumping: bin/java -Xshare:off
>>
>>    init_cdsumping: bin/java -Xshare:dump
>>
>> The class initialization orderings are identical for 'bin/java 
>> -Xshare:off' and 'bin/java -Xshare:dump' before the initialization of 
>> sun.launcher.LauncherHelper.
>
> Thanks! That's very interesting. How do you actually initiate 
> execution of Java code at dump time - ie how far in the VM init 
> sequence do we go before you do the dump and exit?

Currently the dumping process is done at the very end of 
Threads::create_vm() so we can avoid interfering with the initialization 
order. The module system is initialized in initPhase2, which happens 
before the dumping process. Module system initialization runs some java 
code.

During loading and dumping, we invokes the system loader's loadClass() 
method explicitly for each class specified in the classes list (please 
see ClassListParser::load_current_class). That also triggers java code 
execution.
>
> I compared the dump list with what I see currently, before your patch, 
> and it initializes exactly the same number of classes - 279, but not 
> in exactly the same order, and I can't readily tell that it is the 
> same 279 classes (but suspect it is). So I'm a little unsure as to 
> what exactly your patch does today, and how it might be used in the 
> future for the Long$LongCache issue ?
My current patch does not have any visible effect on the class 
initialization for dump time yet. When the LongCache being adding for 
archiving, we should see Long and Long$LongCache being initialized at 
dump time. Just to verify, I just tried dumping out the initialized 
classes without my patch and I saw the lists is identical (attached 
init_cdsdumping0). The orderings of the initialization are the same with 
and without current patch. My repo was synced earlier this afternoon. 
Maybe there are some differences between our local repos? A library 
change (or other change) could potentially change the ordering.

Really appreciate that you are taking a closer look on this!

Thanks,
Jiangli
>
> Thanks,
> David
>
>> Thanks,
>>
>> Jiangli
>>
>>
>> On 11/7/18 4:56 PM, David Holmes wrote:
>>> Hi Jiangli,
>>>
>>> Messing with the established initialization order still rings alarm 
>>> bells for me. Can you generate the normal class initialization list 
>>> for VM startup, and one for a CDS dump, so that we can see how they 
>>> differ. It would very easy for subtle initialization bugs to creep 
>>> in here. (Even with the existing use of Java code during dump time.)
>>>
>>> Thanks,
>>> David
>>>
>>> On 8/11/2018 10:45 AM, Jiangli Zhou wrote:
>>>> Please review following webrev that explicitly runs class 
>>>> initialization for classes (for boot loader only) with registered 
>>>> subgraph archiving entry field(s) during CDS dump time.
>>>>
>>>> At CDS dump time, some of the loaded classes are initialized due to 
>>>> execution of java code. Currently there are 279 classes are 
>>>> initialized at dump time. The rest of the loaded classes are not 
>>>> initialized. Running class initialization for the boot classes with 
>>>> registered subgraph archiving entry field(s) will allow those 
>>>> static fields (and their directly/indirectly referenced objects) 
>>>> being populated at CDS dump time and archived. The Long$LongCache 
>>>> (planned for JDK-8213033 by Claes, thanks!) is such an example.
>>>>
>>>>    webrev: http://cr.openjdk.java.net/~jiangli/8213439/webrev.00/
>>>>
>>>>    RFE: https://bugs.openjdk.java.net/browse/JDK-8213439
>>>>
>>>> The initialization of a class is triggered explicitly when 
>>>> processing the subgraph entry fields at dump time. For any class 
>>>> that's already initialized at this point, it's essentially a nop. 
>>>> That's the case for current existing subgraph entries.
>>>>
>>>> Tested with tier1-tier3. Thanks David and Ioi's for discussions in 
>>>> the bug report.
>>>>
>>>> Thanks,
>>>>
>>>> Jiangli
>>>>
>>

-------------- next part --------------
Initializing java.lang.Object
Initializing java.lang.CharSequence
Initializing java.lang.String
Initializing java.util.Comparator
Initializing java.lang.String$CaseInsensitiveComparator
Initializing java.lang.System
Initializing java.lang.reflect.AnnotatedElement
Initializing java.lang.reflect.Type
Initializing java.lang.Class
Initializing java.lang.ThreadGroup
Initializing java.lang.Thread
Initializing java.security.AccessController
Initializing java.security.AccessControlContext
Initializing java.lang.Module
Initializing java.util.Set
Initializing java.lang.Iterable
Initializing java.util.Collection
Initializing java.util.AbstractCollection
Initializing java.util.ImmutableCollections$AbstractImmutableCollection
Initializing java.util.ImmutableCollections$AbstractImmutableSet
Initializing java.util.ImmutableCollections$Set12
Initializing java.util.Objects
Initializing java.lang.reflect.AccessibleObject
Initializing jdk.internal.reflect.ReflectionFactory$GetReflectionFactoryAction
Initializing jdk.internal.reflect.Reflection
Initializing java.util.Map
Initializing java.util.AbstractMap
Initializing java.util.ImmutableCollections$AbstractImmutableMap
Initializing java.util.ImmutableCollections$MapN
Initializing jdk.internal.misc.VM
Initializing java.lang.Math
Initializing java.lang.Number
Initializing java.lang.Float
Initializing java.lang.Double
Initializing java.util.ImmutableCollections
Initializing java.lang.ClassLoader
Initializing java.util.AbstractSet
Initializing java.util.HashSet
Initializing java.util.HashMap
Initializing java.util.concurrent.ConcurrentMap
Initializing java.util.concurrent.ConcurrentHashMap
Initializing java.lang.Runtime
Initializing java.io.ObjectStreamField
Initializing java.lang.Integer
Initializing jdk.internal.misc.Unsafe
Initializing jdk.internal.reflect.ReflectionFactory
Initializing java.lang.ref.Reference
Initializing java.lang.ref.Reference$ReferenceHandler
Initializing java.lang.ref.PhantomReference
Initializing jdk.internal.ref.Cleaner
Initializing java.lang.ref.ReferenceQueue
Initializing java.lang.ref.ReferenceQueue$Null
Initializing java.lang.ref.ReferenceQueue$Lock
Initializing java.lang.ref.Reference$1
Initializing jdk.internal.access.SharedSecrets
Initializing java.lang.reflect.Executable
Initializing java.lang.reflect.Method
Initializing java.lang.ref.FinalReference
Initializing java.lang.ref.Finalizer
Initializing java.lang.ref.Finalizer$FinalizerThread
Initializing java.util.Dictionary
Initializing java.util.Hashtable
Initializing java.util.Properties
Initializing java.lang.StringLatin1
Initializing java.util.concurrent.ConcurrentHashMap$Node
Initializing java.util.Properties$EntrySet
Initializing java.util.concurrent.ConcurrentHashMap$CollectionView
Initializing java.util.concurrent.ConcurrentHashMap$EntrySetView
Initializing java.util.Collections
Initializing java.util.Collections$EmptySet
Initializing java.util.List
Initializing java.util.AbstractList
Initializing java.util.Collections$EmptyList
Initializing java.util.Collections$EmptyMap
Initializing java.util.Collections$SynchronizedCollection
Initializing java.util.Collections$SynchronizedSet
Initializing java.lang.reflect.Array
Initializing java.util.concurrent.ConcurrentHashMap$Traverser
Initializing java.util.concurrent.ConcurrentHashMap$BaseIterator
Initializing java.util.Iterator
Initializing java.util.concurrent.ConcurrentHashMap$EntryIterator
Initializing java.util.concurrent.ConcurrentHashMap$MapEntry
Initializing jdk.internal.util.StaticProperty
Initializing java.lang.VersionProps
Initializing java.io.InputStream
Initializing java.io.FileInputStream
Initializing java.io.FileDescriptor
Initializing java.io.FileDescriptor$1
Initializing java.io.OutputStream
Initializing java.io.FileOutputStream
Initializing java.io.FilterInputStream
Initializing java.io.BufferedInputStream
Initializing java.io.FilterOutputStream
Initializing java.io.PrintStream
Initializing java.io.BufferedOutputStream
Initializing java.io.Writer
Initializing java.io.OutputStreamWriter
Initializing sun.nio.cs.StreamEncoder
Initializing java.nio.charset.Charset
Initializing java.nio.charset.spi.CharsetProvider
Initializing sun.nio.cs.StandardCharsets
Initializing java.lang.ThreadLocal
Initializing java.util.concurrent.atomic.AtomicInteger
Initializing sun.security.action.GetPropertyAction
Initializing sun.nio.cs.Unicode
Initializing sun.nio.cs.UTF_8
Initializing java.nio.charset.CharsetEncoder
Initializing sun.nio.cs.UTF_8$Encoder
Initializing java.nio.charset.CodingErrorAction
Initializing java.util.Arrays
Initializing java.nio.Buffer
Initializing java.nio.Buffer$1
Initializing java.nio.ByteBuffer
Initializing java.nio.HeapByteBuffer
Initializing java.nio.ByteOrder
Initializing java.io.BufferedWriter
Initializing java.lang.Terminator
Initializing java.lang.Terminator$1
Initializing jdk.internal.misc.Signal
Initializing java.lang.Integer$IntegerCache
Initializing java.util.Hashtable$Entry
Initializing jdk.internal.misc.Signal$Handler
Initializing jdk.internal.misc.Signal$NativeHandler
Initializing jdk.internal.misc.OSEnvironment
Initializing java.lang.System$2
Initializing java.lang.Throwable
Initializing java.lang.Error
Initializing java.lang.VirtualMachineError
Initializing java.lang.OutOfMemoryError
Initializing java.lang.Exception
Initializing java.lang.RuntimeException
Initializing java.lang.NullPointerException
Initializing java.lang.ClassCastException
Initializing java.lang.ArrayStoreException
Initializing java.lang.ArithmeticException
Initializing java.lang.StackOverflowError
Initializing java.lang.IllegalMonitorStateException
Initializing java.lang.IllegalArgumentException
Initializing java.lang.invoke.MethodHandle
Initializing java.lang.invoke.MethodHandleStatics
Initializing java.lang.Boolean
Initializing java.lang.Character
Initializing java.lang.CharacterData
Initializing java.lang.CharacterDataLatin1
Initializing java.lang.invoke.ResolvedMethodName
Initializing java.lang.invoke.MemberName
Initializing java.lang.invoke.MethodHandleNatives
Initializing jdk.internal.module.ModuleBootstrap
Initializing java.lang.module.ModuleDescriptor
Initializing java.lang.module.ModuleDescriptor$1
Initializing java.io.File
Initializing java.io.DefaultFileSystem
Initializing java.io.FileSystem
Initializing java.io.UnixFileSystem
Initializing java.lang.AbstractStringBuilder
Initializing java.lang.StringBuilder
Initializing jdk.internal.module.ModulePatcher
Initializing java.util.ImmutableCollections$SetN
Initializing jdk.internal.module.ArchivedModuleGraph
Initializing jdk.internal.module.SystemModuleFinders
Initializing java.net.URI
Initializing java.net.URI$1
Initializing jdk.internal.module.SystemModulesMap
Initializing jdk.internal.module.SystemModules$default
Initializing jdk.internal.module.Builder
Initializing java.lang.module.ModuleDescriptor$Exports
Initializing java.util.ImmutableCollections$AbstractImmutableList
Initializing java.util.ImmutableCollections$List12
Initializing java.lang.module.ModuleDescriptor$Provides
Initializing java.lang.module.ModuleDescriptor$Version
Initializing java.util.ArrayList
Initializing java.lang.Enum
Initializing java.lang.module.ModuleDescriptor$Modifier
Initializing java.lang.module.ModuleDescriptor$Requires$Modifier
Initializing java.lang.module.ModuleDescriptor$Requires
Initializing java.lang.module.ModuleDescriptor$Opens
Initializing java.util.ImmutableCollections$ListN
Initializing jdk.internal.module.ModuleTarget
Initializing jdk.internal.module.ModuleHashes$Builder
Initializing java.util.HashMap$Node
Initializing jdk.internal.module.ModuleHashes
Initializing java.util.Collections$UnmodifiableMap
Initializing jdk.internal.module.SystemModuleFinders$2
Initializing java.lang.module.ModuleReference
Initializing jdk.internal.module.ModuleReferenceImpl
Initializing java.util.KeyValueHolder
Initializing jdk.internal.module.SystemModuleFinders$3
Initializing jdk.internal.module.SystemModuleFinders$SystemModuleFinder
Initializing jdk.internal.module.ModuleBootstrap$Counters
Initializing java.util.Optional
Initializing jdk.internal.loader.BootLoader
Initializing jdk.internal.module.ServicesCatalog
Initializing jdk.internal.loader.AbstractClassLoaderValue
Initializing jdk.internal.loader.ClassLoaderValue
Initializing jdk.internal.loader.ClassLoaders
Initializing java.security.SecureClassLoader
Initializing java.lang.ClassLoader$ParallelLoaders
Initializing java.util.WeakHashMap
Initializing java.util.Collections$SetFromMap
Initializing java.util.WeakHashMap$KeySet
Initializing java.lang.ref.WeakReference
Initializing java.util.WeakHashMap$Entry
Initializing jdk.internal.loader.BuiltinClassLoader
Initializing jdk.internal.loader.ClassLoaders$BootClassLoader
Initializing java.util.Vector
Initializing java.security.ProtectionDomain
Initializing java.security.ProtectionDomain$JavaSecurityAccessImpl
Initializing java.security.CodeSource
Initializing java.security.ProtectionDomain$Key
Initializing jdk.internal.loader.ClassLoaders$PlatformClassLoader
Initializing jdk.internal.loader.URLClassPath
Initializing java.net.URL
Initializing java.net.URL$DefaultFactory
Initializing java.net.URL$3
Initializing java.io.File$PathStatus
Initializing sun.net.www.ParseUtil
Initializing java.net.URLStreamHandler
Initializing sun.net.www.protocol.file.Handler
Initializing java.lang.Class$ReflectionData
Initializing java.lang.ref.SoftReference
Initializing java.lang.Class$Atomic
Initializing java.lang.reflect.Constructor
Initializing java.lang.reflect.Modifier
Initializing java.lang.reflect.ReflectAccess
Initializing java.lang.Class$1
Initializing jdk.internal.reflect.MagicAccessorImpl
Initializing jdk.internal.reflect.ConstructorAccessorImpl
Initializing jdk.internal.reflect.NativeConstructorAccessorImpl
Initializing jdk.internal.reflect.DelegatingConstructorAccessorImpl
Initializing java.util.ArrayDeque
Initializing jdk.internal.util.Preconditions
Initializing jdk.internal.loader.ClassLoaders$AppClassLoader
Initializing jdk.internal.loader.BuiltinClassLoader$LoadedModule
Initializing sun.net.www.protocol.jrt.Handler
Initializing java.util.ImmutableCollections$SetN$SetNIterator
Initializing jdk.internal.module.Modules
Initializing java.lang.module.Configuration
Initializing java.util.AbstractMap$1
Initializing java.util.AbstractMap$1$1
Initializing java.util.ImmutableCollections$MapN$1
Initializing java.util.ImmutableCollections$MapN$MapNIterator
Initializing java.lang.module.ResolvedModule
Initializing java.util.ImmutableCollections$Set12$1
Initializing jdk.internal.module.ModuleLoaderMap
Initializing java.util.function.Function
Initializing jdk.internal.module.ModuleLoaderMap$Mapper
Initializing java.util.concurrent.ConcurrentHashMap$ForwardingNode
Initializing java.lang.ModuleLayer
Initializing java.util.ImmutableCollections$ListItr
Initializing java.util.ArrayList$Itr
Initializing java.util.Collections$UnmodifiableCollection
Initializing java.util.Collections$UnmodifiableSet
Initializing java.util.Collections$UnmodifiableCollection$1
Initializing java.util.concurrent.CopyOnWriteArrayList
Initializing jdk.internal.module.ServicesCatalog$ServiceProvider
Initializing java.util.HashMap$KeySet
Initializing java.util.HashMap$HashIterator
Initializing java.util.HashMap$KeyIterator
Initializing java.lang.ModuleLayer$Controller
Initializing jdk.internal.module.IllegalAccessLogger$Mode
Initializing jdk.internal.module.IllegalAccessLogger$Builder
Initializing java.util.HashMap$Values
Initializing java.util.HashMap$ValueIterator
Initializing jdk.internal.module.ModuleBootstrap$2
Initializing java.util.HashMap$EntrySet
Initializing java.util.HashMap$EntryIterator
Initializing jdk.internal.module.IllegalAccessLogger
Initializing jdk.internal.vm.PostVMInitHook
Initializing java.util.Locale
Initializing sun.util.locale.LocaleObjectCache
Initializing java.util.Locale$Cache
Initializing sun.util.locale.BaseLocale
Initializing sun.util.locale.BaseLocale$Cache
Initializing sun.util.locale.BaseLocale$Key
Initializing sun.util.locale.LocaleObjectCache$CacheEntry
Initializing sun.util.locale.LocaleUtils
Initializing sun.util.locale.InternalLocaleBuilder
Initializing sun.util.locale.InternalLocaleBuilder$CaseInsensitiveChar
Initializing jdk.internal.vm.PostVMInitHook$1


More information about the hotspot-runtime-dev mailing list