RFR: JDK-8136991: [REDO] Additional number of processed references printed with -XX:+PrintReferenceGC after JDK-8047125
Bengt Rutisson
bengt.rutisson at oracle.com
Fri Sep 25 08:27:42 UTC 2015
Hi Kim,
On 2015-09-25 00:40, Kim Barrett wrote:
> On Sep 23, 2015, at 8:19 AM, Bengt Rutisson <bengt.rutisson at oracle.com> wrote:
>> Updated webrev:
>> http://cr.openjdk.java.net/~brutisso/8136991/webrev.04/
> ------------------------------------------------------------------------------
> src/share/vm/gc/shared/referenceProcessor.cpp
> 195 GCRefTraceTime(ReferenceType ref_type, bool doit, GCTimer* timer, GCId gc_id, size_t count) :
> 196 _gc_trace_time(reference_type_to_short_string(ref_type), doit, false, timer, gc_id) {
> 197 log_ref_count(count);
> 198 }
>
> The _gc_trace_time printing is controlled by the doit parameter, while
> log_ref_count is (internally) controlled by PrintReferenceGC and
> PrintGCDetails. Those two are presently equivalent, but that isn't at
> all obvious and could change later. I think the call to log_ref_count
> ought to be conditional on doit here.
>
> If the call to log_ref_count for JNI Weak References were similarly
> conditional on trace_time, then log_ref_count wouldn't need any
> internal conditionalization at all.
I see what you mean. The problem is that the JNI Weak Reference logging
is only done for non-product builds. That means that if I want to guard
the call to log_ref there I no longer have a one liner and need to go to
#ifndef PRODUCT instead of just using the NOT_PRODUCT macro. When I do
the unified logging changes the log_ref function will go away and even
the non-product guard can go away. So, I think this can be cleaned up by
that change.
In the meantime I suggest that log_ref takes a parameter "doit" to make
it clearer that it is the same as for the GCTraceTime. Are you ok with that?
>
> ------------------------------------------------------------------------------
> src/share/vm/gc/shared/referenceProcessor.cpp
> 236 GCRefTraceTime tt(REF_SOFT, trace_time, gc_timer, gc_id, stats.soft_count());
>
> I don't understand the point of the change here and in later similar
> places to replace the string name of the reference type with the
> REF_XXX reference type. It is this change that seems to drive the
> addition of reference_type_to_[short_]string. And
> reference_type_to_string appears to be unused in these changes.
You are right. I had some intermediate change where I needed to know the
reference type, but as it is now this change is unnecessary. I reverted it.
>
> ------------------------------------------------------------------------------
> src/share/vm/gc/shared/referenceProcessor.cpp
> [removed comment]
> 246 // Process cleaners, but include them in phantom statistics. We expect
> 247 // Cleaner references to be temporary, and don't want to deal with
> 248 // possible incompatibilities arising from making it more visible.
>
> This comment was removed. (Actually, it was moved to the earlier
> capture of the counts.) However, it is still applicable here in that
> we include cleaner processing in the time associated with phantom
> reference processing.
I added the comment back. But I also left the comment in its new place
where we set up the statistics. Since I've already missed reading this
comment once I think it could be good to have it in both places where we
treat Cleaners specially.
>
> ------------------------------------------------------------------------------
> Regarding GCRefTraceTime, GCCMTraceTime, GCTraceTime
>
> Version 04 webrev has GCTraceTime derived from StackObj, with
> GCRefTraceTime and GCCMTraceTime having a GCTraceTime member and
> derived from nothing.
>
> Being derived from nothing is supposed to be disallowed; quoting from
> allocation.hpp:
>
> All classes in the virtual machine must be subclassed by one of the
> following allocation classes.
>
> Better would be to separate out the present implementation of
> GCTraceTime into a helper class (let's call it GCTraceTimeImpl), which
> is a VALUE_OBJ_CLASS_SPEC class. Then GCTraceTime, GCCMTraceTime, and
> GCRefTraceTime all derive from StackObj and have a GCTraceTimeImpl
> member.
Good suggestion.
Here's an updated webrev:
http://cr.openjdk.java.net/~brutisso/8136991/webrev.05
(Note that referenceType.hpp is unchanged even if webrev decides to
include it.)
And here's a diff compared to the last version:
http://cr.openjdk.java.net/~brutisso/8136991/webrev.04-05.diff
Thanks,
Bengt
>
> ------------------------------------------------------------------------------
>
More information about the hotspot-gc-dev
mailing list