RFR(s): 8203682: Add jcmd "VM.classloaders" command to print out class loader hierarchy, details

coleen.phillimore at oracle.com coleen.phillimore at oracle.com
Thu May 31 22:07:19 UTC 2018


Can you make BranchTracker : public StackObj {} ? Are you going to move 
BranchTracker to utilities if you find other uses for it?

I don't like the use of mtInternal, but there doesn't seem to be a 
better category (or one to add).

  152     if (_loader_oop != NULL) {
  153       loader_klass = _loader_oop->klass();
  154       if (loader_klass != NULL) {
  155         loader_class_name = loader_klass->external_name();
  156       }
  157       oop nameOop = java_lang_ClassLoader::name(_loader_oop);
  158       if (nameOop != NULL) {
  159         const char* s = java_lang_String::as_utf8_string(nameOop);
  160         if (s != NULL) {
  161           loader_name = s;
  162         }
  163       }

These are available to the ClassLoaderData (_cld) as class_loader_name() 
and class_loader_klass().  I would rather see 
ClassLoaderData::loader_name() used - once fixed. Also, I don't like 
<unnamed> in the output.  It seems that most class loaders will be 
unnamed, so the output will be too noisy with that.  Also, there's an 
unnamed module so that makes it very confusing.

Since this is in a safepoint, maybe you can add a ResourceMark at 472, 
remove it from 362 and make all classes ResourceObj allocated. Then you 
can remove the code to delete the types.

Can you add assert that you are at a safepoint at the beginning of this, 
so you don't have to worry about LoaderTreeNode::_loader_oop getting 
collected. It seems that by saving _cld in LoaderTreeNode, that you 
don't need _loader_oop.

This code looks like it's walking the CLDG in order to make a different 
Class loader graph for printing.  Is it necessary to show the hierarchy 

It seems like printing the address is better than <unnamed>, which is 
what I've looked at with the system dictionary logging.


What is JMXExecutor? Is this something to get in the way of debugging 
this test if it fails?

Sorry for the delay reviewing.

On 5/28/18 5:33 AM, Thomas Stüfe wrote:
> Hi Bernd,
> definitely. I have two local patches here and corresponding RFEs open:
> https://bugs.openjdk.java.net/browse/JDK-8203343
> "VM.{metaspace|classloaders} jcmd should show invocation targets for
> Generated{Method|Constructor}AccessorImpl classes"
> https://bugs.openjdk.java.net/browse/JDK-8203849
> "DelegatingClassLoader name could be used to indicate reflected class"
> Both complement each other and should make it possible to understand
> core reflection class loader issues better.
> Nice idea about that folding, I can add this.
> I plan to get them upstream for 11, but that may be illusory seeing
> how slow reviews are currently going. But certainly 12.
> Gruss, Thomas
> On Mon, May 28, 2018 at 9:21 AM, Bernd Eckenfels <ecki at zusammenkunft.net> wrote:
>> Anything which can be done with the DelegatingClassLoaders (either add Info on their target or collabs them to a „30 x unnamed DelegatingClassloader“. Even in Verbose mode they only reveal their type (constructor,  method) but not much more.
>> Gruss
>> Bernd
>> --
>> http://bernd.eckenfels.net
>> ________________________________
>> From: serviceability-dev <serviceability-dev-bounces at openjdk.java.net> on behalf of Thomas Stüfe <thomas.stuefe at gmail.com>
>> Sent: Monday, May 28, 2018 6:50:34 AM
>> To: serviceability-dev at openjdk.java.net serviceability-dev at openjdk.java.net; Hotspot dev runtime
>> Subject: Re: RFR(s): 8203682: Add jcmd "VM.classloaders" command to print out class loader hierarchy, details
>> All tests passed on jdk-submit.
>> Anyone interested in a review?
>> More output examples for jcmd VM.classloaders :
>> Spring framework, basic tree:
>> http://cr.openjdk.java.net/~stuefe/webrevs/8203682-jcmd-print-classloader-hierarchy/example_spring_short.txt
>> Spring framework, including all classes:
>> http://cr.openjdk.java.net/~stuefe/webrevs/8203682-jcmd-print-classloader-hierarchy/example_spring_long.txt
>> ... Thomas
>> On Wed, May 23, 2018 at 2:46 PM, Thomas Stüfe <thomas.stuefe at gmail.com> wrote:
>>> Dear all,
>>> (not sure if this would be a serviceability or runtime rfe, so sorry
>>> for crossposting)
>>> may I please have feedback/reviews for this small enhancement.
>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8203682
>>> Webrev: http://cr.openjdk.java.net/~stuefe/webrevs/8203682-jcmd-print-classloader-hierarchy/webrev.00/webrev/
>>> This adds a new command to jcmd, "VM.classloaders". It complements the
>>> existing command "VM.classloader_stats".
>>> This command, in its simplest form, prints the class loader tree. In
>>> addition to that, it optionally prints out loaded classes (both
>>> non-anonymous and anonymous) and various classloader specific
>>> information.
>>> Examples:
>>> http://cr.openjdk.java.net/~stuefe/webrevs/8203682-jcmd-print-classloader-hierarchy/example.txt
>>> http://cr.openjdk.java.net/~stuefe/webrevs/8203682-jcmd-print-classloader-hierarchy/example-with-classes.txt
>>> http://cr.openjdk.java.net/~stuefe/webrevs/8203682-jcmd-print-classloader-hierarchy/example-with-reflection-and-noinflation.txt
>>> Thanks and Best Regards,
>>> Thomas

More information about the hotspot-runtime-dev mailing list