RFR: 8079408: Reimplement TraceClassLoading, TraceClassUnloading, and TraceClassLoaderData with Unified Logging.
Coleen Phillimore
coleen.phillimore at oracle.com
Fri Jan 8 23:54:14 UTC 2016
Hi, I have a bunch of comments that Ioi may have to help answer because
I had some questions about how the logging output comes out.
http://cr.openjdk.java.net/~mockner/classload.01/src/share/vm/classfile/classLoaderData.cpp.udiff.html
I think these can be UL-ized with less lines. There's no need to check
if log_is_enabled here.
*!if (TraceClassLoaderData && Verbose&& class_loader() != NULL) {*
*!tty->print_cr("is_anonymous: %s",
class_loader()->klass()->internal_name());*
*!if (_log_is_enabled(Trace, classloaderdata)_&& class_loader() != NULL) {*
*!_outputStream* log = LogHandle(classloaderdata)::trace_stream(_);*
*+ log->print_cr("is_anonymous: %s",
class_loader()->klass()->internal_name());*
}
*!if (class_loader() != NULL) {*
*!tty->print_cr("is_anonymous: %s",
class_loader()->klass()->internal_name());*
*+ log_trace(classloaderdata)("is_anonymous: %s",
class_loader()->klass()->internal_name());*
}
What does this come out looking like? It seems like it's going to have
[classloaderdata] in front of every line printed. I think this wants to
be all one log line.
*+ outputStream* log = LogHandle(classloaderdata)::debug_stream();*
*+ log->print("create class loader data " INTPTR_FORMAT, p2i(cld));*
*+ log->print(" for instance " INTPTR_FORMAT " of %s", p2i((void
*)cld->class_loader()),*
*+ cld->loader_name());*
*+ *
*+ if (string.not_null()) {*
*+ log->print(": ");*
*+ java_lang_String::print(string(), log);*
*+ } *
[classloaderdata] create class loader data <address>
[classloaderdata] for instance <addr> of some name
[classloaderdata] :
[classloaderdata] some string
???
http://cr.openjdk.java.net/~mockner/classload.01/src/share/vm/memory/filemap.cpp.udiff.html
You don't need to check log_is_enabled. log_debug macro does that. 2
instances in this file.
*+ if (log_is_enabled(Debug, classload)) {*
*+ log_debug(classload)("[Add main shared path (%s) %s]",
(cpe->is_jar_file() ? "jar" : "dir"), name);*
*+ } *
http://cr.openjdk.java.net/~mockner/classload.01/src/share/vm/oops/instanceKlass.cpp.udiff.html
Do you want this to come out with fewer lines? Maybe the messages
should be collected in a tempStream and printed out at the end? LIke in
this file:
http://cr.openjdk.java.net/~rprotacio/8144953/src/share/vm/c1/c1_Runtime1.cpp.udiff.html
There's a bunch of tty->print's still in this function.
*+ Handle class_loader(loader_data->class_loader());*
*+ tty->print(" source: %s", class_loader->klass()->external_name()); *
This could be simplified avoiding the Handle, which is not needed.
*+ tty->print(" source: %s",
loader_data->class_loader()->klass()->external_name());*
Is the loader_data argument to print_loading_log simply the
instanceKLass::_class_loader_data field? In which case you can remove
the argument and have:
*+ tty->print(" source: %s", class_loader()->klass()->external_name());
*
Obviously not to tty.
http://cr.openjdk.java.net/~mockner/classload.01/src/share/vm/prims/jvmtiEnv.cpp.udiff.html
This one can be condensed also
*!if (_log_is_enabled(Info, classload)_) {*
*!_outputStream* log = LogHandle(classload)::info_stream(_);*
*+ log->print_cr("[Opened %s]", zip_entry->name());*
}
to
*+ log_info(classload)("[Opened %s]", zip_entry->name());
*
http://cr.openjdk.java.net/~mockner/classload.01/src/share/vm/runtime/arguments.cpp.udiff.html
Yes, I think -verbose:class should be converted to UL. Ioi's #2 in his
previous mail.
http://cr.openjdk.java.net/~mockner/classload.01/src/share/vm/services/classLoadingService.cpp.udiff.html
The return value 'ret' isn't used. Either return an error if it returns
and error (what errors does it return?) or don't have 'ret'.
http://cr.openjdk.java.net/~mockner/classload.01/test/runtime/logging/ClassLoadUnload.java.html
Test looks great to me!
150 checkFor("[classload]", "java.lang.Object", "source:");
151 checkFor("[classunload]", "[Unloading class");
Can this be:
150 checkFor("[classload]", "java.lang.Object", "source:", "[classunload]", "[Unloading class");
To not start a new process?
Thanks,
Coleen
On 1/8/16 2:10 AM, Max Ockner wrote:
> Hello,
> Please review this unified logging conversion for several related
> flags in the class loading system.
>
> Bugs:
> https://bugs.openjdk.java.net/browse/JDK-8079408 (classload,
> classloaderdata)
> https://bugs.openjdk.java.net/browse/JDK-8142506 (classunload)
>
> Webrev: http://cr.openjdk.java.net/~mockner/classload.01/
>
> Summary:
>
> There are two separate issues here. Originally Ioi and I began working
> on these fixes in parallel, but eventually it became obvious that the
> classload and classunload tags needed to be implemented together. This
> change is a combination of Ioi's change for 8079408 and my change for
> 8142506.
>
> (1) "-XX:+TraceClassLoading" ==> "-Xlog:classload=info"
> This flag is added to the alias table. More verbose logging exists at
> level debug (one level of verbosity up from info)
>
> (2) "-XX:+TraceClassUnLoading" ==> "-Xlog:classunload=info"
> This flag is added to the alias table. More verbose logging exists at
> level trace (converted from uses of WizardMode)
>
> (3) "-XX:+TraceClassLoaderData" ==> "-Xlog:classloaderdata=debug"
>
> The changes to TraceClassLoading and TraceClassUnloading also effected
> the implementation of "-verbose:class"
>
> Tested with: jtreg runtime, runThese with "-Xlog:classload=trace
> -Xlog:classunload=trace -Xlog:classloaderdata=trace".
>
> If you have questions about the updates to the classloading log, Ioi
> can give a better answer than I can.
>
> Thanks,
> Max
>
>
>
>
More information about the hotspot-runtime-dev
mailing list