Hey Folks,

Sorry about the delay in getting the next webrev for this out. I was sidetracked by a few other things, including being out sick of almost a week, and there were also quite a few changes to make.

I'm ready for review with an updated webrev, but thought first I'd have you look at and comment on the output. Please see the attached file. It now supports:
  • printing the hierarchy for a single class
  • optionally including all subclasses of the specified class (-s)
  • for each class, also list all of its interfaces (-i)
The hex value in the output is the address of the ClassLoaderData for the ClassLoader of the class. I did not include the address of the Klass, but could if you think it would be useful. Changing the format of what comes after the classname is easy. Just let me know what you think is best.

I have not updated any other dcmds to be consistent with how classes are uniquely identified. A separate bug should be filed for that. Actually I thought one was, but I looked through this thread's history and could not find mention of it. I also have not implemented the reverse hierarchy dcmd. JDK-8068830 has already been filed for that, but there are no plans to work on it in the near term.

thanks,

Chris

On 1/7/15 3:29 PM, Chris Plummer wrote:
Hi,

Please review the following changes for the addition of the VM.class_hierarchy DCMD. Please read the bug first for some background information.

Webrev: http://cr.openjdk.java.net/~cjplummer/8054888/webrev.00/
Bug: https://bugs.openjdk.java.net/browse/JDK-8054888

I expect there will be further restructuring or additional feature work. More discussion on that below. I'm not sure if that additional work will be done later with a separately bug filed or with this initial commit. That's one thing I want to work out with this review.

Currently the bulk of the DCMD is implemented in heapInspection.cpp. TheĀ  main purpose of this file is to implement the GC.class_stats and GC.class_histogram DCMDs. Both of them require walking the java heap to count live objects of each type, thus the name "heapInspection.cpp". This new VM.class_hierarchy DCMD does not require walking the heap, but is implemented in this file because it leverages the existing KlassInfoTable and related classes (KlassInfoEntry, KlassInfoBucket, and KlassClosure).

KlassInfoTable makes it easy to build a database of all loaded classes, save additional info gathered for each class, iterate over them quickly, and also do quick lookups. This exactly what I needed for this DCMD, thus the reuse. There is some downside to this. For starters, heapInspection.cpp is not the proper place for a DCMD that has nothing to do with heap inspection. Also, KlassInfoEntry is being overloaded now to support 3 different DCMDs, as is KlassInfoTable. As a result each has a few fields and methods that are not used for all 3 DCMDs. Some subclassing might be in order here, but I'm not sure if it's worth it. Opinions welcomed. If I am going to refactor, I would prefer that be done as a next step so I'm not disturbing the existing DCMDs with this first implementation.

I added some comments to code only used for GC.class_stats and GC.class_histogram. I did this when trying to figure them out so I could better understand how to implement VM.class_hierarchy. I can take them out if you think they are not appropriate for this commit.

One other item I like to discuss is whether it is worth adding a class name argument to this DCMD. That would cause just the superclasses and subclasses of the named class to be printed. If you think that is useful, I think it can be added without too much trouble.

At the moment not much testing has been done other than running the DCMD and looking at the output. I'll do more once it's clear the code has "settled". I would like to know if there are any existing tests for GC.class_stats and GC.class_histogram (there are none in the "test" directory). If so, possibly one could serve as the basis for a new test for VM.class_hierarchy.

thanks,

Chris

$> jcmd NeverExit help VM.class_hierarchy
25101:
VM.class_hierarchy
Print a list of all loaded classes, indented to show the class hiearchy.

Impact: Medium: Depends on number of loaded classes.

Syntax : VM.class_hierarchy [options] [<classname>]

Arguments:
        classname : [optional] Name of class whose hierarchy should be printed. 
If not specified, all class hierarchies are printed. (STRING, no default value)

Options: (options must be specified using the <key> or <key>=<value> syntax)
        -i : [optional] Inherited interfaces should be printed. (BOOLEAN, false)
        -s : [optional] If a classname is specified, print its subclasses. 
Otherwise only it superclasses are printed. (BOOLEAN, false)

$> jcmd NeverExit VM.class_hierarchy java.lang.Error
25101:
java.lang.Object (0x080609c8)
|--java.lang.Throwable (0x080609c8)
|  |--java.lang.Error (0x080609c8)

$> jcmd NeverExit VM.class_hierarchy java.lang.Error -i
25101:
java.lang.Object (0x080609c8)
|--java.lang.Throwable (0x080609c8)
|  implements java.io.Serializable (declared intf)
|  |--java.lang.Error (0x080609c8)
|  |  implements java.io.Serializable (transitive intf)

$> jcmd NeverExit VM.class_hierarchy java.lang.Error -s
25101:
java.lang.Object (0x080609c8)
|--java.lang.Throwable (0x080609c8)
|  |--java.lang.Error (0x080609c8)
|  |  |--java.lang.VirtualMachineError (0x080609c8)
|  |  |  |--java.lang.StackOverflowError (0x080609c8)
|  |  |  |--java.lang.OutOfMemoryError (0x080609c8)
|  |  |--java.lang.LinkageError (0x080609c8)
|  |  |  |--java.lang.IncompatibleClassChangeError (0x080609c8)
|  |  |  |  |--java.lang.NoSuchMethodError (0x080609c8)
|  |  |  |--java.lang.BootstrapMethodError (0x080609c8)
|  |  |  |--java.lang.NoClassDefFoundError (0x080609c8)
|  |  |--java.lang.ThreadDeath (0x080609c8)

$> jcmd NeverExit VM.class_hierarchy java.lang.Error -s -i
25101:
java.lang.Object (0x080609c8)
|--java.lang.Throwable (0x080609c8)
|  implements java.io.Serializable (declared intf)
|  |--java.lang.Error (0x080609c8)
|  |  implements java.io.Serializable (transitive intf)
|  |  |--java.lang.VirtualMachineError (0x080609c8)
|  |  |  implements java.io.Serializable (transitive intf)
|  |  |  |--java.lang.StackOverflowError (0x080609c8)
|  |  |  |  implements java.io.Serializable (transitive intf)
|  |  |  |--java.lang.OutOfMemoryError (0x080609c8)
|  |  |  |  implements java.io.Serializable (transitive intf)
|  |  |--java.lang.LinkageError (0x080609c8)
|  |  |  implements java.io.Serializable (transitive intf)
|  |  |  |--java.lang.IncompatibleClassChangeError (0x080609c8)
|  |  |  |  implements java.io.Serializable (transitive intf)
|  |  |  |  |--java.lang.NoSuchMethodError (0x080609c8)
|  |  |  |  |  implements java.io.Serializable (transitive intf)
|  |  |  |--java.lang.BootstrapMethodError (0x080609c8)
|  |  |  |  implements java.io.Serializable (transitive intf)
|  |  |  |--java.lang.NoClassDefFoundError (0x080609c8)
|  |  |  |  implements java.io.Serializable (transitive intf)
|  |  |--java.lang.ThreadDeath (0x080609c8)
|  |  |  implements java.io.Serializable (transitive intf)

yolanda:/myws/hotspot/jdk9/hs-rt/hotspot> jcmd NeverExit VM.class_hierarchy
25101:
java.lang.Object (0x080609c8)
|--java.net.Parts (0x080609c8)
|--java.nio.charset.spi.CharsetProvider (0x080609c8)
|  |--sun.nio.cs.FastCharsetProvider (0x080609c8)
|  |  |--sun.nio.cs.StandardCharsets (0x080609c8)
|--java.lang.Number (0x080609c8)
|  |--java.lang.Float (0x080609c8)
|  |--java.lang.Long (0x080609c8)
|  |--java.util.concurrent.atomic.AtomicLong (0x080609c8)
|  |--java.lang.Integer (0x080609c8)
|  |--java.util.concurrent.atomic.AtomicInteger (0x080609c8)
|  |--java.lang.Short (0x080609c8)
|  |--java.lang.Byte (0x080609c8)
|  |--java.lang.Double (0x080609c8)
|--java.nio.channels.spi.AbstractInterruptibleChannel (0x080609c8)
|  |--java.nio.channels.FileChannel (0x080609c8)
|  |  |--sun.nio.ch.FileChannelImpl (0x080609c8)
|--java.nio.file.Path (0x080609c8, intf)
|--java.lang.reflect.Parameter (0x080609c8)
|--java.nio.channels.InterruptibleChannel (0x080609c8, intf)
|--sun.misc.SharedSecrets (0x080609c8)
|--java.lang.invoke.CallSite (0x080609c8)
|  |--java.lang.invoke.VolatileCallSite (0x080609c8)
|  |--java.lang.invoke.MutableCallSite (0x080609c8)
|  |--java.lang.invoke.ConstantCallSite (0x080609c8)
|--java.util.concurrent.atomic.AtomicReferenceFieldUpdater (0x080609c8)
|  
|--java.util.concurrent.atomic.AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl
 (0x080609c8)
|--sun.nio.cs.ArrayDecoder (0x080609c8, intf)
|--java.nio.file.Watchable (0x080609c8, intf)
|--sun.misc.PerfCounter$CoreCounters (0x080609c8)
|--java.lang.invoke.MethodHandle (0x080609c8)
|  |--java.lang.invoke.DirectMethodHandle (0x080609c8)
|--sun.misc.Perf (0x080609c8)
|--java.lang.Enum (0x080609c8)
|  |--sun.launcher.LauncherHelper (0x080609c8)
|  |--java.io.File$PathStatus (0x080609c8)
|--java.lang.CharacterData (0x080609c8)
|  |--java.lang.CharacterDataLatin1 (0x080609c8)
|--java.nio.channels.ScatteringByteChannel (0x080609c8, intf)
|--java.lang.StringCoding$StringDecoder (0x080609c8)
|--java.lang.Character (0x080609c8)
|--java.nio.channels.GatheringByteChannel (0x080609c8, intf)
|--java.lang.reflect.ReflectAccess (0x080609c8)
|--java.nio.channels.SeekableByteChannel (0x080609c8, intf)
|--java.lang.ref.Reference$1 (0x080609c8)
|--java.util.BitSet (0x080609c8)
|--sun.misc.Launcher$AppClassLoader$1 (0x080609c8)
|--java.lang.ref.Reference (0x080609c8)
|  |--java.lang.ref.PhantomReference (0x080609c8)
|  |  |--sun.misc.Cleaner (0x080609c8)
|  |--java.lang.ref.FinalReference (0x080609c8)
|  |  |--java.lang.ref.Finalizer (0x080609c8)
|  |--java.lang.ref.WeakReference (0x080609c8)
|  |  |--java.lang.ThreadLocal$ThreadLocalMap$Entry (0x080609c8)
|  |  |--java.lang.ClassValue$Entry (0x080609c8)
|  |  |--java.util.WeakHashMap$Entry (0x080609c8)
|  |--java.lang.ref.SoftReference (0x080609c8)
|  |  |--sun.util.locale.LocaleObjectCache$CacheEntry (0x080609c8)
|--java.lang.String$CaseInsensitiveComparator (0x080609c8)
|--sun.misc.JavaLangRefAccess (0x080609c8, intf)
|--java.nio.channels.ByteChannel (0x080609c8, intf)
|--java.lang.ref.Reference$Lock (0x080609c8)
|--java.nio.channels.WritableByteChannel (0x080609c8, intf)
|--java.util.Comparator (0x080609c8, intf)
|--java.io.InputStream (0x080609c8)
|  |--java.io.FilterInputStream (0x080609c8)
|  |  |--java.io.BufferedInputStream (0x080609c8)
|  |--java.io.ByteArrayInputStream (0x080609c8)
|  |--java.io.FileInputStream (0x080609c8)
|--java.nio.channels.ReadableByteChannel (0x080609c8, intf)
|--java.lang.Cloneable (0x080609c8, intf)
|--java.lang.ref.ReferenceQueue$Lock (0x080609c8)
|--sun.reflect.LangReflectAccess (0x080609c8, intf)
|--java.lang.invoke.MethodType (0x080609c8)
|--java.nio.channels.Channel (0x080609c8, intf)
|--java.nio.charset.Charset (0x080609c8)
|  |--sun.nio.cs.Unicode (0x080609c8)
|  |  |--sun.nio.cs.UTF_8 (0x080609c8)
|--sun.misc.Perf$GetPerfAction (0x080609c8)
|--java.lang.Class (0x080609c8)
|--sun.reflect.ReflectionFactory (0x080609c8)
|--sun.misc.PostVMInitHook (0x080609c8)
|--java.lang.Readable (0x080609c8, intf)
|--java.lang.ThreadLocal$ThreadLocalMap (0x080609c8)
|--java.io.Closeable (0x080609c8, intf)
|--sun.misc.PerfCounter (0x080609c8)
|--sun.util.locale.LocaleUtils (0x080609c8)
|--java.lang.AutoCloseable (0x080609c8, intf)
|--java.lang.ref.ReferenceQueue (0x080609c8)
|  |--java.lang.ref.ReferenceQueue$Null (0x080609c8)
|--java.lang.reflect.Modifier (0x080609c8)
|--java.util.concurrent.ConcurrentMap (0x080609c8, intf)
|--java.lang.Void (0x080609c8)
|--java.io.OutputStream (0x080609c8)
|  |--java.io.FileOutputStream (0x080609c8)
|  |--java.io.FilterOutputStream (0x080609c8)
|  |  |--java.io.BufferedOutputStream (0x080609c8)
|  |  |--java.io.PrintStream (0x080609c8)
|--java.util.Collections$SynchronizedMap (0x080609c8)
|--java.io.Flushable (0x080609c8, intf)
|--sun.misc.Unsafe (0x080609c8)
|--java.lang.reflect.Member (0x080609c8, intf)
|--java.io.FileInputStream$1 (0x080609c8)
|--java.lang.Class$MethodArray (0x080609c8)
|--java.lang.invoke.MethodHandleStatics$1 (0x080609c8)
|--java.io.ObjectStreamField (0x080609c8)
|--sun.nio.ByteBuffered (0x080609c8, intf)
|--java.util.Locale$LocaleKey (0x080609c8)
|--java.security.Principal (0x080609c8, intf)
|--java.lang.invoke.MethodHandleStatics (0x080609c8)
|--sun.misc.Resource (0x080609c8)
|  |--sun.misc.URLClassPath$FileLoader$1 (0x080609c8)
|--java.lang.reflect.AccessibleObject (0x080609c8)
|  |--java.lang.reflect.Field (0x080609c8)
|  |--java.lang.reflect.Executable (0x080609c8)
|  |  |--java.lang.reflect.Constructor (0x080609c8)
|  |  |--java.lang.reflect.Method (0x080609c8)
|--java.lang.StringCoding (0x080609c8)
|--java.security.ProtectionDomain$Key (0x080609c8)
|--java.util.Collections$UnmodifiableCollection (0x080609c8)
|  |--java.util.Collections$UnmodifiableList (0x080609c8)
|  |  |--java.util.Collections$UnmodifiableRandomAccessList (0x080609c8)
|--java.io.ExpiringCache (0x080609c8)
|--sun.util.locale.BaseLocale$Key (0x080609c8)
|--java.util.concurrent.atomic.AtomicBoolean (0x080609c8)
|--java.security.ProtectionDomain$3 (0x080609c8)
|--sun.misc.JavaSecurityProtectionDomainAccess (0x080609c8, intf)
|--java.lang.Math (0x080609c8)
|--java.util.ArrayList$Itr (0x080609c8)
|--java.security.ProtectionDomain$1 (0x080609c8)
|--java.lang.invoke.MemberName$Factory (0x080609c8)
|--java.security.AccessControlContext (0x080609c8)
|--sun.misc.JavaSecurityAccess (0x080609c8, intf)
|--java.util.Dictionary (0x080609c8)
|  |--java.util.Hashtable (0x080609c8)
|  |  |--java.util.Properties (0x080609c8)
|--sun.net.www.ParseUtil (0x080609c8)
|--java.io.FileDescriptor$1 (0x080609c8)
|--java.util.AbstractCollection (0x080609c8)
|  |--java.util.AbstractList (0x080609c8)
|  |  |--java.util.Vector (0x080609c8)
|  |  |  |--java.util.Stack (0x080609c8)
|  |  |--java.util.Collections$EmptyList (0x080609c8)
|  |  |--java.util.ArrayList (0x080609c8)
|  |--java.util.AbstractSet (0x080609c8)
|  |  |--java.util.WeakHashMap$KeySet (0x080609c8)
|  |  |--java.util.Collections$SetFromMap (0x080609c8)
|  |  |--java.util.HashSet (0x080609c8)
|  |  |--java.util.Collections$EmptySet (0x080609c8)
|  |  |--java.util.Hashtable$EntrySet (0x080609c8)
|--sun.util.locale.LocaleObjectCache (0x080609c8)
|  |--java.util.Locale$Cache (0x080609c8)
|  |--sun.util.locale.BaseLocale$Cache (0x080609c8)
|--java.nio.charset.CharsetEncoder (0x080609c8)
|  |--sun.nio.cs.UTF_8$Encoder (0x080609c8)
|--java.io.FileSystem (0x080609c8)
|  |--java.io.UnixFileSystem (0x080609c8)
|--sun.misc.Launcher$ExtClassLoader$1 (0x080609c8)
|--sun.misc.JavaIOFileDescriptorAccess (0x080609c8, intf)
|--java.lang.Boolean (0x080609c8)
|--java.net.URLClassLoader$7 (0x080609c8)
|--java.io.FileDescriptor (0x080609c8)
|--sun.misc.JavaNetAccess (0x080609c8, intf)
|--sun.util.locale.BaseLocale (0x080609c8)
|--java.lang.invoke.LambdaForm (0x080609c8)
|--java.util.concurrent.locks.AbstractQueuedSynchronizer$Node (0x080609c8)
|--java.lang.ClassValue$Version (0x080609c8)
|--java.util.AbstractMap (0x080609c8)
|  |--java.util.WeakHashMap (0x080609c8)
|  |  |--java.lang.ClassValue$ClassValueMap (0x080609c8)
|  |--java.util.Collections$EmptyMap (0x080609c8)
|  |--java.util.HashMap (0x080609c8)
|  |  |--java.util.LinkedHashMap (0x080609c8)
|  |  |  |--java.io.ExpiringCache$1 (0x080609c8)
|  |--java.util.concurrent.ConcurrentHashMap (0x080609c8)
|  |--sun.util.PreHashedMap (0x080609c8)
|  |  |--sun.nio.cs.StandardCharsets$Cache (0x080609c8)
|  |  |--sun.nio.cs.StandardCharsets$Classes (0x080609c8)
|  |  |--sun.nio.cs.StandardCharsets$Aliases (0x080609c8)
|--sun.reflect.ReflectionFactory$1 (0x080609c8)
|--java.nio.Buffer (0x080609c8)
|  |--java.nio.CharBuffer (0x080609c8)
|  |  |--java.nio.HeapCharBuffer (0x080609c8)
|  |--java.nio.ByteBuffer (0x080609c8)
|  |  |--java.nio.MappedByteBuffer (0x080609c8)
|  |  |  |--java.nio.DirectByteBuffer (0x080609c8)
|  |  |  |  |--java.nio.DirectByteBufferR (0x080609c8)
|  |  |--java.nio.HeapByteBuffer (0x080609c8)
|  |--java.nio.IntBuffer (0x080609c8)
|  |  |--java.nio.ByteBufferAsIntBufferB (0x080609c8)
|  |  |--java.nio.DirectIntBufferU (0x080609c8)
|  |  |  |--java.nio.DirectIntBufferRU (0x080609c8)
|  |--java.nio.LongBuffer (0x080609c8)
|  |  |--java.nio.DirectLongBufferU (0x080609c8)
|--java.lang.ClassValue$Identity (0x080609c8)
|--java.util.Locale (0x080609c8)
|--sun.reflect.CallerSensitive (0x080609c8, intf)
|--java.lang.annotation.Annotation (0x080609c8, intf)
|--java.lang.Class$1 (0x080609c8)
|--sun.nio.ch.DirectBuffer (0x080609c8, intf)
|--java.security.ProtectionDomain (0x080609c8)
|--java.util.concurrent.locks.AbstractOwnableSynchronizer (0x080609c8)
|  |--java.util.concurrent.locks.AbstractQueuedSynchronizer (0x080609c8)
|  |  |--java.util.concurrent.locks.ReentrantLock$Sync (0x080609c8)
|  |  |  |--java.util.concurrent.locks.ReentrantLock$NonfairSync (0x080609c8)
|--jdk.internal.jimage.concurrent.ConcurrentPReader$TemporaryBuffer (0x080609c8)
|--java.lang.StackTraceElement (0x080609c8)
|--java.lang.ClassValue (0x080609c8)
|  |--java.lang.invoke.MethodHandleImpl$4 (0x080609c8)
|--sun.reflect.annotation.AnnotationType (0x080609c8)
|--sun.nio.ch.Util$4 (0x080609c8)
|--sun.nio.cs.ArrayEncoder (0x080609c8, intf)
|--sun.reflect.FieldAccessor (0x080609c8, intf)
|--java.lang.reflect.Type (0x080609c8, intf)
|--java.io.DefaultFileSystem (0x080609c8)
|--jdk.internal.jimage.PReader (0x080609c8)
|  |--jdk.internal.jimage.concurrent.ConcurrentPReader (0x080609c8)
|--sun.nio.cs.HistoricallyNamedCharset (0x080609c8, intf)
|--sun.misc.MetaIndex (0x080609c8)
|--java.util.Hashtable$Entry (0x080609c8)
|--sun.misc.Version (0x080609c8)
|--java.util.Map (0x080609c8, intf)
|--java.security.CodeSource (0x080609c8)
|--java.lang.reflect.GenericDeclaration (0x080609c8, intf)
|--sun.security.action.GetPropertyAction (0x080609c8)
|--jdk.internal.jimage.ImageLocation (0x080609c8)
|--java.lang.reflect.AnnotatedElement (0x080609c8, intf)
|--java.io.FilePermission$1 (0x080609c8)
|--java.lang.SecurityManager (0x080609c8)
|--sun.nio.ch.Util (0x080609c8)
|--java.lang.Class$AnnotationData (0x080609c8)
|--jdk.internal.jimage.UTF8String (0x080609c8)
|--java.lang.invoke.MethodHandleImpl$3 (0x080609c8)
|--java.util.concurrent.ConcurrentHashMap$CollectionView (0x080609c8)
|  |--java.util.concurrent.ConcurrentHashMap$EntrySetView (0x080609c8)
|  |--java.util.concurrent.ConcurrentHashMap$ValuesView (0x080609c8)
|  |--java.util.concurrent.ConcurrentHashMap$KeySetView (0x080609c8)
|--sun.reflect.generics.repository.AbstractRepository (0x080609c8)
|  |--sun.reflect.generics.repository.GenericDeclRepository (0x080609c8)
|  |  |--sun.reflect.generics.repository.ClassRepository (0x080609c8)
|--java.lang.ClassLoader$ParallelLoaders (0x080609c8)
|--java.lang.invoke.MethodHandleImpl$2 (0x080609c8)
|--java.util.function.Function (0x080609c8, intf)
|--sun.misc.VM (0x080609c8)
|--java.lang.Runtime (0x080609c8)
|--sun.security.util.Debug (0x080609c8)
|--java.nio.Bits$1 (0x080609c8)
|--sun.misc.Launcher (0x080609c8)
|--java.util.RandomAccess (0x080609c8, intf)
|--sun.nio.ch.FileChannelImpl$Unmapper (0x080609c8)
|--java.util.Arrays (0x080609c8)
|--java.lang.invoke.MethodHandleImpl$1 (0x080609c8)
|--java.util.List (0x080609c8, intf)
|--sun.misc.JavaNioAccess (0x080609c8, intf)
|--sun.misc.Launcher$BootClassPathHolder$1 (0x080609c8)
|--java.util.Set (0x080609c8, intf)
|--sun.reflect.ConstantPool (0x080609c8)
|--jdk.internal.jimage.PackageModuleMap (0x080609c8)
|--sun.nio.ch.NativeThread (0x080609c8)
|--sun.misc.Launcher$BootClassPathHolder (0x080609c8)
|--java.lang.String (0x080609c8)
|--sun.net.www.MessageHeader (0x080609c8)
|--java.lang.Class$Atomic (0x080609c8)
|--java.util.jar.Manifest (0x080609c8)
|--java.util.concurrent.ConcurrentHashMap$CounterCell (0x080609c8)
|--java.nio.channels.spi.AbstractInterruptibleChannel$1 (0x080609c8)
|--java.io.Writer (0x080609c8)
|  |--java.io.BufferedWriter (0x080609c8)
|  |--sun.nio.cs.StreamEncoder (0x080609c8)
|  |--java.io.OutputStreamWriter (0x080609c8)
|--java.util.Collection (0x080609c8, intf)
|--jdk.internal.jimage.ImageStream (0x080609c8)
|--sun.nio.ch.Interruptible (0x080609c8, intf)
|--java.util.concurrent.ConcurrentHashMap$Node (0x080609c8)
|--java.lang.invoke.MethodHandleImpl (0x080609c8)
|--jdk.internal.jimage.BasicImageReader (0x080609c8)
|  |--jdk.internal.jimage.ImageReader (0x080609c8)
|--java.lang.AbstractStringBuilder (0x080609c8)
|  |--java.lang.StringBuilder (0x080609c8)
|  |--java.lang.StringBuffer (0x080609c8)
|--java.lang.Class$ReflectionData (0x080609c8)
|--java.nio.channels.FileChannel$MapMode (0x080609c8)
|--java.util.Hashtable$Enumerator (0x080609c8)
|--java.util.HashMap$Node (0x080609c8)
|  |--java.util.LinkedHashMap$Entry (0x080609c8)
|  |  |--java.util.HashMap$TreeNode (0x080609c8)
|--java.lang.Iterable (0x080609c8, intf)
|--java.lang.Class$3 (0x080609c8)
|--java.lang.System$2 (0x080609c8)
|--java.nio.ByteOrder (0x080609c8)
|--jdk.internal.jimage.ImageHeader (0x080609c8)
|--java.util.Iterator (0x080609c8, intf)
|--java.util.Map$Entry (0x080609c8, intf)
|--sun.reflect.ConstructorAccessor (0x080609c8, intf)
|--java.net.URL (0x080609c8)
|--java.util.concurrent.locks.ReentrantLock (0x080609c8)
|  |--java.util.concurrent.ConcurrentHashMap$Segment (0x080609c8)
|--java.util.Collections (0x080609c8)
|--java.util.Enumeration (0x080609c8, intf)
|--sun.misc.Launcher$Factory (0x080609c8)
|--java.util.concurrent.CopyOnWriteArrayList (0x080609c8)
|--sun.reflect.MethodAccessor (0x080609c8, intf)
|--java.lang.ThreadGroup (0x080609c8)
|--sun.misc.JavaLangAccess (0x080609c8, intf)
|--sun.reflect.MagicAccessorImpl (0x080609c8)
|  |--sun.reflect.FieldAccessorImpl (0x080609c8)
|  |  |--sun.reflect.UnsafeFieldAccessorImpl (0x080609c8)
|  |  |  |--sun.reflect.UnsafeStaticFieldAccessorImpl (0x080609c8)
|  |--sun.reflect.ConstructorAccessorImpl (0x080609c8)
|  |  |--sun.reflect.DelegatingConstructorAccessorImpl (0x080609c8)
|  |  |--sun.reflect.NativeConstructorAccessorImpl (0x080609c8)
|  |--sun.reflect.MethodAccessorImpl (0x080609c8)
|--java.net.URLStreamHandlerFactory (0x080609c8, intf)
|--java.util.Objects (0x080609c8)
|--java.nio.Bits (0x080609c8)
|--java.lang.Throwable (0x080609c8)
|  |--java.lang.Exception (0x080609c8)
|  |  |--java.lang.InterruptedException (0x080609c8)
|  |  |--java.lang.ReflectiveOperationException (0x080609c8)
|  |  |  |--java.lang.ClassNotFoundException (0x080609c8)
|  |  |--java.io.IOException (0x080609c8)
|  |  |--java.lang.RuntimeException (0x080609c8)
|  |  |  |--java.lang.IllegalMonitorStateException (0x080609c8)
|  |  |  |--java.lang.ArrayStoreException (0x080609c8)
|  |  |  |--java.lang.ClassCastException (0x080609c8)
|  |  |  |--java.lang.ArithmeticException (0x080609c8)
|  |  |  |--java.lang.NullPointerException (0x080609c8)
|  |  |  |--java.lang.IllegalArgumentException (0x080609c8)
|  |--java.lang.Error (0x080609c8)
|  |  |--java.lang.VirtualMachineError (0x080609c8)
|  |  |  |--java.lang.StackOverflowError (0x080609c8)
|  |  |  |--java.lang.OutOfMemoryError (0x080609c8)
|  |  |--java.lang.LinkageError (0x080609c8)
|  |  |  |--java.lang.IncompatibleClassChangeError (0x080609c8)
|  |  |  |  |--java.lang.NoSuchMethodError (0x080609c8)
|  |  |  |--java.lang.BootstrapMethodError (0x080609c8)
|  |  |  |--java.lang.NoClassDefFoundError (0x080609c8)
|  |  |--java.lang.ThreadDeath (0x080609c8)
|--jdk.internal.jimage.ImageStrings (0x080609c8)
|--java.security.cert.Certificate (0x080609c8)
|--java.util.concurrent.locks.Lock (0x080609c8, intf)
|--java.lang.invoke.MethodHandleNatives (0x080609c8)
|--sun.nio.ch.NativeDispatcher (0x080609c8)
|  |--sun.nio.ch.FileDispatcher (0x080609c8)
|  |  |--sun.nio.ch.FileDispatcherImpl (0x080609c8)
|--sun.misc.URLClassPath (0x080609c8)
|--java.lang.ThreadLocal (0x080609c8)
|  |--jdk.internal.jimage.concurrent.ConcurrentPReader$TemporaryBuffer$1 
(0x080609c8)
|  |--sun.nio.ch.Util$1 (0x080609c8)
|--sun.misc.OSEnvironment (0x080609c8)
|--sun.reflect.ReflectionFactory$GetReflectionFactoryAction (0x080609c8)
|--java.util.Collections$SynchronizedCollection (0x080609c8)
|  |--java.util.Collections$SynchronizedSet (0x080609c8)
|--java.io.ObjectStreamClass (0x080609c8)
|--java.security.PrivilegedAction (0x080609c8, intf)
|--java.lang.Integer$IntegerCache (0x080609c8)
|--java.lang.Appendable (0x080609c8, intf)
|--sun.misc.NativeSignalHandler (0x080609c8)
|--java.lang.System (0x080609c8)
|--java.lang.Thread$UncaughtExceptionHandler (0x080609c8, intf)
|--sun.misc.Signal (0x080609c8)
|--java.security.PermissionCollection (0x080609c8)
|  |--java.security.BasicPermissionCollection (0x080609c8)
|  |--java.io.FilePermissionCollection (0x080609c8)
|  |--java.security.Permissions (0x080609c8)
|--sun.nio.ch.NativeThreadSet (0x080609c8)
|--sun.misc.URLClassPath$Loader (0x080609c8)
|  |--sun.misc.URLClassPath$FileLoader (0x080609c8)
|  |--sun.misc.URLClassPath$JImageLoader (0x080609c8)
|--java.lang.Thread (0x080609c8)
|  |--java.lang.ref.Reference$ReferenceHandler (0x080609c8)
|  |--java.lang.ref.Finalizer$FinalizerThread (0x080609c8)
|  |--sun.misc.InnocuousThread (0x080609c8)
|--NeverExit (0xa533bfe0)
|--java.net.URLStreamHandler (0x080609c8)
|  |--sun.net.www.protocol.jar.Handler (0x080609c8)
|  |--sun.net.www.protocol.file.Handler (0x080609c8)
|--java.lang.invoke.MemberName (0x080609c8)
|--NE2 (0xa533bfe0, intf)
|--NE1 (0xa533bfe0, intf)
|--java.lang.Terminator$1 (0x080609c8)
|--sun.nio.ch.IOUtil$1 (0x080609c8)
|--sun.misc.SignalHandler (0x080609c8, intf)
|--java.lang.CharSequence (0x080609c8, intf)
|--java.lang.Terminator (0x080609c8)
|--java.nio.charset.CodingErrorAction (0x080609c8)
|--java.nio.charset.CoderResult$Cache (0x080609c8)
|  |--java.nio.charset.CoderResult$2 (0x080609c8)
|  |--java.nio.charset.CoderResult$1 (0x080609c8)
|--sun.nio.ch.IOUtil (0x080609c8)
|--sun.net.www.protocol.jrt.JavaRuntimeURLConnection$ResourceFinder 
(0x080609c8, intf)
|--java.lang.Comparable (0x080609c8, intf)
|--java.security.AccessController (0x080609c8)
|--java.io.Serializable (0x080609c8, intf)
|--java.lang.ClassLoader (0x080609c8)
|  |--java.security.SecureClassLoader (0x080609c8)
|  |  |--java.net.URLClassLoader (0x080609c8)
|  |  |  |--sun.misc.Launcher$AppClassLoader (0x080609c8)
|  |  |  |--sun.misc.Launcher$ExtClassLoader (0x080609c8)
|  |--sun.reflect.DelegatingClassLoader (0x080609c8)
|--java.io.ExpiringCache$Entry (0x080609c8)
|--java.nio.charset.CoderResult (0x080609c8)
|--sun.reflect.misc.ReflectUtil (0x080609c8)
|--sun.misc.URLClassPath$3 (0x080609c8)
|--java.nio.charset.CharsetDecoder (0x080609c8)
|  |--sun.nio.cs.UTF_8$Decoder (0x080609c8)
|--java.net.URLConnection (0x080609c8)
|  |--sun.net.www.URLConnection (0x080609c8)
|  |  |--sun.net.www.protocol.file.FileURLConnection (0x080609c8)
|  |  |--sun.net.www.protocol.jrt.JavaRuntimeURLConnection (0x080609c8)
|--sun.net.util.URLUtil (0x080609c8)
|--java.io.File (0x080609c8)
|--java.lang.ClassLoader$3 (0x080609c8)
|--sun.reflect.Reflection (0x080609c8)
|--java.net.URLClassLoader$1 (0x080609c8)
|--java.util.StringTokenizer (0x080609c8)
|--java.lang.StringCoding$StringEncoder (0x080609c8)
|--java.nio.file.attribute.FileAttribute (0x080609c8, intf)
|--java.util.concurrent.atomic.AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl$1
 (0x080609c8)
|--java.security.Permission (0x080609c8)
|  |--java.security.UnresolvedPermission (0x080609c8)
|  |--java.security.AllPermission (0x080609c8)
|  |--java.io.FilePermission (0x080609c8)
|  |--java.security.BasicPermission (0x080609c8)
|  |  |--java.lang.reflect.ReflectPermission (0x080609c8)
|  |  |--java.lang.RuntimePermission (0x080609c8)
|--java.security.PrivilegedExceptionAction (0x080609c8, intf)
|--sun.nio.ch.IOStatus (0x080609c8)
|--java.lang.Runnable (0x080609c8, intf)
|--java.security.Guard (0x080609c8, intf)
|--java.lang.SystemClassLoaderAction (0x080609c8)
|--java.lang.ClassLoader$NativeLibrary (0x080609c8)

Reply via email to