Chris,

Just saw this. I was thinking the instance in the heap since you might have 
multiple instances of a single subclass.
Good point that it might change and so the correlation would be gone.

thanks,
Karen

On Feb 6, 2015, at 5:09 PM, Chris Plummer wrote:

> Hi Karen,
> 
> Can you clarify what you mean by "address of the j.l.ClassLoader class". Is 
> that the Klass* for the ClassLoader subclass, or the actual address of the 
> ClassLoader instance in the heap, which can change.
> 
> Chris
> 
> On 2/6/15 1:21 PM, Karen Kinnear wrote:
>> Chris,
>> 
>> So I was curious - I was thinking you would printing the hex address of the 
>> j.l.ClassLoader class rather than the cld so that if folks were to look
>> at a heap dump later it might be meaningful to them. Is it unlikely that 
>> they would ever want to correlate those?
>> 
>> 
>> On Feb 6, 2015, at 3:15 PM, Chris Plummer wrote:
>> 
>>> I was also thinking it might be a good idea to indicate what the hex value 
>>> is, although still have figured out the best way of doing                 
>>> this. Maybe just a simple comment before the output. Keep in mind that 
>>> eventually other DCMDS will also include the cld to help uniquiely identify 
>>> classes across dcmd output. Also keep in mind your earlier suggestion:
>>> 
>>> java.lang.Object/0x12345600
>>> |--java.io.Serializable/0x12345601
>>> |--java.util.RandomAccess/0x12345602
>>> |--java.lang.Iterable/0x12345603
>>> | |--java.util.Collection/0x12345604
>>> | | |--java.util.List/0x12345605
>>> |--java.util.AbstractCollection/0x12345606
>>> | |  implements java.util.Collection/0x12345604
>>> | |  implements java.lang.Iterable/0x12345603
>>> | |--java.util.AbstractList/0x12345607
>>> | |    implements java.util.List/0x12345605
>>> | | |--java.util.Arrays$ArrayList/0x12345608
>>> | | |    implements java.io.Serializable/0x12345601
>>> | | |    implements java.util.RandomAccess/0x12345602
>>> 
>>> With additions to GC.class_stats:
>>> 
>>> Index Super ClassLoader        ClassName
>>>     1    -1 0x00000007c0034c48 java.lang.Object/0x12345600
>>>     2     1 0x00000007c0034c48 java.util.List/0x12345605
>>>     3    31 0x00000007c0034c48 java.util.AbstractList/0x12345607
>>> 
>>> And GC.class_histogram:
>>> 
>>>  num     #instances         #bytes  class name
>>> ----------------------------------------------
>>>    1:           945         117736  java.lang.Object/0x12345600
>>>    2:           442          50352  java.util.List/0x12345605
>>>    3:           499          25288  java.util.AbstractList/0x12345607
>>> 
>>> I think in your case you assumed we would create a unique identifier for 
>>> each class, but then we settled on just classname + ClassLoader identifier 
>>> of some sort, and the CLD* works for that. So replace your hex class ID in 
>>> the above with the hex CLD*.
>>> 
>>> Also something Karen had said is just now starting to sink in and make 
>>> sense to me:
>>> 
>>> |-sun.misc.Launcher$AppClassLoader/null (0xyyy)
>>> |-myapp/0xyyy
>>> 
>>> I think the idea here is that when printing a ClassLoader subclass, you 
>>> include two CLDs. The first is for the ClassLoader that loaded the class, 
>>> and the second is the CLD for the ClassLoader subclass itself. Thus the 
>>> above indicates that myapp was loaded by 0xyyy, which is the 
>>> sun.misc.Launcher$AppClassLoader, which was loaded by the null ClassLoader. 
>> I apologize - I don't remember what I said. But I am not sure we need that 
>> level of complexity. I think I was asking that one of the dcmds that gives
>> information could print information like 0xabc "a 
>> sun.misc.Launcher$AppClassLoader" or "a WLS.blah.GenericClassLoader" if we 
>> don't want to include
>> that everywhere. Mostly people want to know the name of the class loader. 
>> Since they don't yet have names, they want to know the type of the
>> classloader. So that string "a MyClassLoader" would be more meaningful than 
>> the 0xabc - except that if they
>> have 5 of those they need the uniqueness. So personally I think I was 
>> proposing the 
>>   java.base, 0xA/"a MyClassLoader", iface).
>> 
>> But I would defer to Staffan if he suggests something else.
>> 
>> thanks for your patience,
>> Karen
>>> 
>>> With regard to the '/' format, keep in mind that we also need an indicator 
>>> of whether or not it's an interface, and there's also a request to include 
>>> the module name when that becomes available. At one point you requested the 
>>> following, which is what I was aiming for:
>>> 
>>> java.lang.Object
>>> |--java.io.Serializable (java.base, 0x00000007c00375f8, iface)
>>> |--java.util.RandomAccess (java.base, 0x00000007c00375f8, iface)
>>> 
>>> So maybe I can do:
>>> 
>>> java.lang.Object
>>> |--java.io.Serializable/0x00000007c00375f8 (java.base, intf)
>>> |--java.util.RandomAccess/0x00000007c00375f8 (java.base, intf)
>>> ...
>>> |-sun.misc.Launcher$AppClassLoader/0x00000007c00375f8 (java.base, 
>>> CLD=0x000000087654320)
>>> |-myapp/0x000000087654320
>>> 
>>> So now the classname and its classloader id (which is the CLD*)  are 
>>> grouped together to make it easy to strip out or to search for in more than 
>>> one dcmd output. I think this is probably what you were striving when you 
>>> proposed using '/', and other DCMDs can eventually be changed to do the 
>>> same. Also, once you know the CLD of the ClassLoader, you can find out the 
>>> name of the ClassLoader class by looking for CLD=<classloaderID>
>>> 
>>> I can go with "null" for the null ClassLoader if you want. I used it's 
>>> ClassLoaderData* to be consistent with the other ClassLoaders. Just let me 
>>> know which you prefer.
>>> 
>>> thanks,
>>> 
>>> Chris
>>> 
>>> On 2/6/15 12:52 AM, Staffan Larsen wrote:
>>>> I think this looks good! Perhaps we should give a hint as to what the hex 
>>>> value is? I don�t know if it is best to print this as part of a �header� 
>>>> printed before the rest of the output or if we should include it as part 
>>>> of each line �(classloaderdata*=0x080609c8)�.
>>>> 
>>>> /Staffan
>>>> 
>>>>> On 6 feb 2015, at 05:49, Chris Plummer <chris.plum...@oracle.com> wrote:
>>>>> 
>>>>> [Hmm. My previous email somehow included the attachment with the dcmd 
>>>>> output, but not the body of the message, so here it is again.]
>>>>> 
>>>>> 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
>>> 
>> 
> 

Reply via email to