RFR: 8079408: Reimplement TraceClassLoading, TraceClassUnloading, and TraceClassLoaderData with Unified Logging.

Ioi Lam ioi.lam at oracle.com
Tue Jan 26 22:58:46 UTC 2016



On 1/26/16 11:23 AM, Coleen Phillimore wrote:
>
> Thanks for recapping the decision.  I didn't remember it from all our 
> discussions, etc.
>
> As the one who looks at these logs and is parsing these for CDS, thank 
> you for confirming that this is intentional.  Do you really have two 
> different output files for info and debug info?

Here's an example:

$ *java -Xlog:gc=trace:file=trace.log -Xlog:gc=info:file=info.log -version*
java version "9-internal"
Java(TM) SE Runtime Environment (build 
9-internal+0-2016-01-20-150959.iklam.jdk9rt)
Java HotSpot(TM) 64-Bit Server VM (build 
9-internal+0-2016-01-20-150959.iklam.jdk9rt, mixed mode)

$*cat trace.log*
[0.002s][trace  ][gc] MarkStackSize: 4096k  MarkStackSizeMax: 16384k
[0.002s][trace  ][gc] ConcGCThreads: 0
[0.122s][info   ][gc] Using G1
[0.001s][trace  ][gc] MarkStackSize: 4096k  MarkStackSizeMax: 16384k
[0.001s][trace  ][gc] ConcGCThreads: 0
[0.102s][info   ][gc] Using G1

$ *cat info.log*
[0.102s][info   ][gc] Using G1

(There's a bug that trace.log has duplicated entries but I think that 
might be already fixed).

>
> Max/Ioi can you add a comment to the code.  This looks easily like 
> someone would "fix" because it looks funny.
>

Since we have 2 blocks of these two statements in two separate files,

if (log_is_enabled(Info, classload)) {
   ik->print_loading_log(LogLevel::Info, _loader_data, _stream);
}
if (log_is_enabled(Debug, classload)) {
   ik->print_loading_log(LogLevel::Debug, _loader_data, _stream);
}

I think it's better to consolidate them into a function inside 
instanceKlass.cpp, like:

InstanceKlass::print_loading_log(loader, stream) {
   if (log_is_enabled(Info, classload)) {
     print_loading_log(LogLevel::Info, loader_data, stream);
   }
   // Do NOT put an 'else' here, so that the following command would
   // work as expected.
   //
   // java -Xlog:classload=info:file=info.log \
   //      -Xlog:classload=debug:file=debug.log MainClass
   if (log_is_enabled(Debug, classload)) {
     print_loading_log(LogLevel::Debug, loader_data, stream);
   }
}

Thanks
- Ioi

> Thanks,
> Coleen
>
> On 1/26/16 12:31 AM, Ioi Lam wrote:
>> On 1/25/16 11:58 AM, Coleen Phillimore wrote:
>>>
>>> Hi Max,
>>>
>>> This looks pretty good.  It's a large change!  A couple of comments:
>>>
>>> http://cr.openjdk.java.net/~mockner/classload.03/src/share/vm/classfile/classFileParser.cpp.udiff.html 
>>>
>>>
>>> As Harold pointed out earlier this change should check for 'else'.
>>>
>>> *!if (_log_is_enabled(Info, classload)_) {*
>>> *!_ik->print_loading_log(LogLevel::Info, _loader_data, _stream)_;*
>>> }  else
>>> *+ if (log_is_enabled(Debug, classload)) {*
>>> *+ ik->print_loading_log(LogLevel::Debug, _loader_data, _stream);*
>>> }
>>>
>>
>> Hi Coleen,
>>
>> The case for the 'else' has been discussed before. Please refer to
>>
>> http://mail.openjdk.java.net/pipermail/hotspot-runtime-dev/2015-November/016460.html 
>>
>> http://mail.openjdk.java.net/pipermail/hotspot-runtime-dev/2015-November/016904.html 
>>
>>
>> To recap: the reason for NOT having the 'else' is for:
>>
>> java -cp ~/tmp -Xlog:classload=info:file=info.log 
>> -Xlog:classload=debug:file=debug.log Foo
>>
>> If you add the 'else' there,  the debug-level output intended for 
>> debug.log will be missing.
>>
>> OK, you may say, let's switch the order of the Info and Debug checks. 
>> But if you do that, the info.log file will have no content.
>>
>> The 'info' level looks like this
>>
>>   java.lang.Object source: /jdk/lib/modules/bootmodules.jimage
>>
>> The 'debug' level looks like this (in a single line):
>>
>>   java.lang.Object source: /jdk/lib/modules/bootmodules.jimage
>>   klass: 0x00000007c0000fb0 super: 0x0000000000000000
>>   loader: [NULL class_loader] bytes: 1640 checksum: ddb8a6f3
>>
>> Because UL buffers at the line level, I cannot split the output into 
>> two parts like this:
>>
>>   [info ][classload] java.lang.Object source: ...
>>   [debug][classload] klass: 0x00000007c0000fb0 super: ...
>>
>> Otherwise some unrelated output may be interleaved between the two 
>> lines, making the output impossible to parse. The ability to parse 
>> the output is very important to tools that analyze the class loading 
>> behavior (e.g., tools related to CDS).
>>
>> Due to this limitation of UL, I think our only choice is to repeat 
>> the class name and 'source' in both info and debug levels, hence NO 
>> 'else' in the code you quoted:
>>
>>   [info ][classload] java.lang.Object source: ..
>>   [debug][classload] java.lang.Object source: .. klass: .. super: ..
>>
>> Thanks
>> - Ioi
>>
>>
>>
>



More information about the hotspot-runtime-dev mailing list