RFR: 8146551: The output from -Xlog:classresolve=info has been shortened
Bengt Rutisson
bengt.rutisson at oracle.com
Sun Mar 6 21:09:34 UTC 2016
On 2016-03-04 18:37, Max Ockner wrote:
> We have tried to preserve some of the output exactly (or very close
> to) the way it was. Some of the corresponding tags produce a ton of
> output. In the case of classresolve, you can not shrink the output
> anymore without changing its meaning, since there is no redundant
> info. I can't think of a good way to split the output across multiple
> levels since all of the output seems equally verbose and equally
> useful. It originally seemed like the output from ConstantPool might
> be the most verbose, and would therefore deserve to live at the Debug
> level, but it only seemed that way because of a subtle flaw in the
> existing logging which exploded the output by a factor of 4. So I
> don't think it would be appropriate to split the output for
> classresolve over several levels.
I don't know this logging in detail, but I think it makes sense to
change the output if it makes the logging more useful. I don't see a
need for us to preserve the exact same log output if another format
would be better. So much is changing anyway with the new logging
framework that this is a good opportunity to improve the logging.
>
> Would you rather see ~1300 unique logging messages for classresolve on
> the Info level or on the Debug level?
With that much logging my guess is that I would prefer it on trace level.
>
> As a side thought, I wonder if Xlog:<tag> should default to the most
> course level which produces output for the specified tag.
That sounds very strange to me.
>
> That way, setting the classresolve output to Debug level would be OK.
> Logging "-Xlog:all" could avoid printing 1300 lines for the
> "classresolve" tag, and "-Xlog:classresolve" would display the output
> for the classresolve tag even though it is debug level. Just a thought.
But if you put the 1300 lines at debug level (or trace) we already don't
print them if you do -Xlog:all.
Thanks,
Bengt
>
> Thanks,
> Max
>
> On 3/4/2016 7:02 AM, Bengt Rutisson wrote:
>>
>>
>> On 2016-03-04 11:25, David Holmes wrote:
>>> On 4/03/2016 7:47 PM, Bengt Rutisson wrote:
>>>>
>>>>
>>>> On 2016-03-04 03:54, David Holmes wrote:
>>>>> On 3/03/2016 7:45 PM, Bengt Rutisson wrote:
>>>>>>
>>>>>> Hi Max and Mikael,
>>>>>>
>>>>>> On 2016-03-03 10:40, Mikael Gerdin wrote:
>>>>>>> Hi Max,
>>>>>>>
>>>>>>> On 2016-03-01 23:30, Max Ockner wrote:
>>>>>>>> Hello,
>>>>>>>>
>>>>>>>> Please review this small fix which attempts to shorten the
>>>>>>>> output from
>>>>>>>> -Xlog:classresolve=info to an acceptable length.
>>>>>>>>
>>>>>>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8146551
>>>>>>>> Webrev: http://cr.openjdk.java.net/~mockner/8146551.02/
>>>>>>>>
>>>>>>>> Summary: java '-Xlog:classresolve=info -version' used to
>>>>>>>> produce 3,683
>>>>>>>> lines of output. This is unacceptably verbose for info level
>>>>>>>> logging and
>>>>>>>> most of the output is not useful.
>>>>>>>>
>>>>>>>> "java -Xlog:classresolve=info -version" used to produce:
>>>>>>>> - 3,683 total lines of output.
>>>>>>>> - 3,121 total lines of output from
>>>>>>>> ConstantPool::trace_class_resolution().
>>>>>>>> - 1,329 unique lines of output.
>>>>>>>> - 767 unique lines of output from
>>>>>>>> ConstantPool::trace_class_resolution().
>>>>>>>> - 562 total lines of output from all other sources, all
>>>>>>>> unique.
>>>>>>>>
>>>>>>>> The code in ConstantPool which called
>>>>>>>> ConstantPool::trace_class_resolution() was doing approximately
>>>>>>>> this:
>>>>>>>>
>>>>>>>> if (log_is_enabled(Info,classresolve)){
>>>>>>>> trace_class_resolution(...)}
>>>>>>>> else { resolve the class }
>>>>>>>>
>>>>>>>> So if logging was turned on, the class would not be resolved
>>>>>>>> properly,
>>>>>>>> but it would produce a log entry saying that the class was being
>>>>>>>> resolved. As a result, the constant pool entry would still
>>>>>>>> contain a
>>>>>>>> Symbol* the next time this piece of code was reached, and it would
>>>>>>>> produce yet another classresolve log entry. In some cases,
>>>>>>>> this was
>>>>>>>> producing many consecutive identical log entries, taking up
>>>>>>>> full pages
>>>>>>>> at worst, and averaging a little over 4 duplicates per message.
>>>>>>>> Not
>>>>>>>> cool.
>>>>>>>>
>>>>>>>> The above duplication issue has been fixed, and the
>>>>>>>> ConstantPool::trace_class_resolution output has been moved to the
>>>>>>>> debug
>>>>>>>> leve. There are still 562 unique lines of output for "java
>>>>>>>> -Xlog:classresolve=info -version". There are now 767 additional
>>>>>>>> unique
>>>>>>>> lines of output when for the "java -Xlog:classresolve=debug
>>>>>>>> -version" .
>>>>>>>> This is better than before but still quite a lot. It seems like
>>>>>>>> all of
>>>>>>>> the info level output is equally important(or unimportant), as
>>>>>>>> you can
>>>>>>>> see in the sample below:
>>>>>>>>
>>>>>>>> [0.026s][info][classresolve] java.lang.reflect.Type
>>>>>>>> java.lang.Object
>>>>>>>> (super)
>>>>>>>> [0.026s][info][classresolve] java.lang.Class java.lang.Object
>>>>>>>> (super)
>>>>>>>> [0.026s][info][classresolve] java.lang.Class java.io.Serializable
>>>>>>>> (interface)
>>>>>>>> [0.026s][info][classresolve] java.lang.Class
>>>>>>>> java.lang.reflect.GenericDeclaration (interface)
>>>>>>>> [0.026s][info][classresolve] java.lang.Class
>>>>>>>> java.lang.reflect.Type
>>>>>>>> (interface)
>>>>>>>> [0.026s][info][classresolve] java.lang.Class
>>>>>>>> java.lang.reflect.AnnotatedElement (interface)
>>>>>>>> [0.026s][info][classresolve] java.lang.Cloneable java.lang.Object
>>>>>>>> (super)
>>>>>>>> [0.027s][info][classresolve] java.lang.ClassLoader
>>>>>>>> java.lang.Object
>>>>>>>> (super)
>>>>>>>> [0.027s][info][classresolve] java.lang.System java.lang.Object
>>>>>>>> (super)
>>>>>>>> [0.027s][info][classresolve] java.lang.Throwable java.lang.Object
>>>>>>>> (super)
>>>>>>>> [0.027s][info][classresolve] java.lang.Throwable
>>>>>>>> java.io.Serializable
>>>>>>>> (interface)
>>>>>>>> [0.027s][info][classresolve] java.lang.Error java.lang.Throwable
>>>>>>>> (super)
>>>>>>>> [0.027s][info][classresolve] java.lang.ThreadDeath java.lang.Error
>>>>>>>> (super)
>>>>>>>>
>>>>>>>> How do you feel about this? Possible solutions include setting all
>>>>>>>> output to debug level, or removing some of the logging messages.
>>>>>>>
>>>>>>> As I stated in the bug my personal opinion is that "info" level
>>>>>>> logging should be fairly limited in order to make "-Xlog:all" a
>>>>>>> useful
>>>>>>> flag to get a reasonable amount of output about what is
>>>>>>> happening in a
>>>>>>> JVM.
>>>>>>>
>>>>>>> One approach could be to move the most verbose output to
>>>>>>> classresolve=trace and keep the rest of classresolve output on the
>>>>>>> debug level.
>>>>>>>
>>>>>>> The fact that the flag was called "TraceClassResolution" is in
>>>>>>> my mind
>>>>>>> a hint that if it produces large amounts of output then perhaps
>>>>>>> that
>>>>>>> output should be logged on the "trace" log level.
>>>>>>
>>>>>> +1 for this approach.
>>>>>
>>>>> As I wrote in the bug report there are philosophically quite
>>>>> different
>>>>> ways to view the the three logging levels - and this has been
>>>>> discussed before. I view "info", "debug" and "trace" as three levels
>>>>> of logging applicable to any chosen tag. Others view them as some
>>>>> global indicator of priority/importance such that some "less
>>>>> important" tags will never use "info" because their output is not
>>>>> considered worthy - only in this world is "-Xlog:all" considered
>>>>> useful.
>>>>>
>>>>> If I say -Xlog:foo I expect to see some logging for foo.
>>>>
>>>> But even if you look at it as that the levels only are applicable
>>>> for a
>>>> particular tag, why would you want "info" on that tag to produce
>>>> extreme
>>>> amounts of data? I would expect -Xlog:foo to give me reasonable high
>>>> level info about foo. If I want more details I would use
>>>> -Xlog:foo=debug.
>>>
>>> It all depends on what you are logging. If it is a high frequency
>>> event then you will get a lot of data even at info levels.
>>
>> But that's my point. If it is a high frequency event you probably
>> don't want to log every event at the info level. That will be useless
>> information. What you probably want to do is aggregate and log useful
>> information less frequently. Then if someone needs to dig into the
>> detail they would enable more logging at debug or trace level to see
>> every individual event.
>>
>> Bengt
>>
>>>
>>> David
>>> -----
>>>
>>>> And if "info" for each individual tag logs a sensible amount of data,
>>>> then -Xlog:all will work pretty well for most cases.
>>>>
>>>> Bengt
>>>>
>>>>>
>>>>> David
>>>>> -----
>>>>>
>>>>>
>>>>>> I quite agree with Mikael that we should be a bit careful what we
>>>>>> log at
>>>>>> info level.
>>>>>>
>>>>>> Thanks,
>>>>>> Bengt
>>>>>>
>>>>>>>
>>>>>>> /Mikael
>>>>>>>
>>>>>>>>
>>>>>>>> Tested with jtreg runtime tests. ClassResolutionTest.java has been
>>>>>>>> modified to check for the new output.
>>>>>>>>
>>>>>>>> Thanks,
>>>>>>>> Max
>>>>>>>>
>>>>>>>>
>>>>>>
>>>>
>>
>
More information about the hotspot-runtime-dev
mailing list