RFR (XXS): 7110173: GCNotifier::pushNotification publishes stale data.
John Cuthbertson
john.cuthbertson at oracle.com
Tue Nov 15 17:33:23 UTC 2011
Hi David,
Thanks for the review. I did and I did that consciously. As you say -
with the current code the listener would only be notified if the
_recordPostGCUsage field of the TraceMemoryManagerStats object is true
(which it is by default) and none of the TraceMemoryManagerStats
instances created by the collectors change this. But there's nothing to
stop a collector creating a TraceMemoryManagerStats object with
_recordPostGCUsage false and_recordGCEndTime true. In this case wouldn't
we still want to notify the listener? I may be wrong (in which case I'll
add the extra guard) but I believe that recording (some) data and
notification should be two independent operations.
Thanks,
JohnC
On 11/14/11 22:35, David Holmes wrote:
> Hi John,
>
> On 15/11/2011 4:46 AM, John Cuthbertson wrote:
>> Can I have a couple of volnteers to review the fix for this CR? The
>> webrev can be found at:
>> http://cr.openjdk.java.net/~johnc/7110173/webrev.0/.
>
> In the original code the pushNotification is conditional on
> recordPostGCUsage, but you've removed that guard by moving the code.
>
> David
> -----
>
>> The issue here was that the routine GCNotifier::pushNotification(),
>> which uses GC data held in GCMemoryManager::_last_gc_stat, was being
>> called before the values in GCMemoryManager::_last_gc_stat were being
>> populated for the current GC. As a result the JVM could pass
>> uninitialized or stale data to a listener. The fix is to move the call
>> to GCNotifier::pushNotification() after the code that populates
>> GCMemoryManager::_last_gc_stat. I also modified the GCStatInfo
>> constructor to fully initialize instances of that class.
>>
>> Testing: The supplied test case on Windows, a crafted test case on
>> Solaris, and the nsk GC tests.
>>
>> Thanks,
>>
>> JohnC
More information about the hotspot-gc-dev
mailing list