Request for review (XXS): 7067973: test/java/lang/management/MemoryMXBean/CollectionUsageThreshold.java hanging intermittently
Bengt Rutisson
bengt.rutisson at oracle.com
Mon Jun 4 11:33:38 UTC 2012
John and Jon,
Thanks for looking at this!
Here is an updated webrev based on your feedback:
http://cr.openjdk.java.net/~brutisso/7173460/webrev.01/
I added the comment that both of you suggested (I took John's wording).
I also made a similar change
G1CollectedHeap::do_collection_pause_at_safepoint(). Good catch, John!
Thanks again for looking at this!
Bengt
On 2012-06-02 02:17, John Cuthbertson wrote:
> Hi Bengt,
>
> The change looks OK to me. I do agree with Jon that a more explanatory
> comment is needed. Perhaps something along the lines:
>
> // We must call G1MonitoringSupport::update_sizes() in the same
> scoping level
> // as an active TraceMemoryManagerStats object (i.e. before the
> destructor for the
> // TraceMemoryManagerStats is called) so that the G1 memory pools are
> updated
> // before any GC notifications are raised.
>
> However, I think that
> G1CollectedHeap::do_collection_pause_at_safepoint() may have the same
> issue.
>
> The scope in which the TraceMemoryManagerStats object is created is at
> line 3612:
>
> // Inner scope for scope based logging, timers, and stats collection
> {
> ...
> TraceCollectorStats tcs(g1mm()->incremental_collection_counters());
> TraceMemoryManagerStats tms(false /* fullGC */, gc_cause());
>
> The TraceMemoryManagerStats object is created at line 3629 (above).
>
> The scope is closed at line 3933:
>
> gc_epilogue(false);
> }
> }
>
> // The closing of the inner scope, immediately above, will complete
> // logging at the "fine" level. The record_collection_pause_end() call
> // above will complete logging at the "finer" level.
>
> The update_sizes() call is at line 3951:
>
> print_heap_after_gc();
> g1mm()->update_sizes();
>
> It should be safe to move these two lines into the scope.
>
> A possible way to test this could be to run the test with
> -XX:+ExplicitGCInvokesConcurrent.
>
> Regards,
>
> JohnC
>
> On 05/31/12 13:04, Bengt Rutisson wrote:
>>
>> Hi all,
>>
>> Can I have a couple of reviews for this really small change?
>> http://cr.openjdk.java.net/~brutisso/7067973/webrev.00/
>>
>> Background:
>> The CollectionUsageThreshold test fails with G1. The test lowers the
>> notification threshold for the G1 old gen memory pool and expects to
>> get a notification after a full GC.
>>
>> The problem in G1 is that the decision to send the notification is
>> done in TraceMemoryManagerStats::~TraceMemoryManagerStats(). This
>> eventually does pool->get_memory_usage() to get the memory usage
>> after a collection. The problem is that we update this information in
>> G1MonitoringSupport::update_sizes() which is called in
>> G1CollectedHeap::do_collection() _after_ the TraceMemoryManagerStats
>> scope had been exited.
>>
>> Extending the scope to cover the call to
>> G1MonitoringSupport::update_sizes() solves the issue.
>>
>> Testing:
>> Before this change the CollectionUsageThreshold failed every time I
>> ran it. After this change it passes every time I ran it.
>>
>> Thanks,
>> Bengt
>
More information about the hotspot-gc-dev
mailing list