Request for review (XXS): 7067973: test/java/lang/management/MemoryMXBean/CollectionUsageThreshold.java hanging intermittently
John Cuthbertson
john.cuthbertson at oracle.com
Sat Jun 2 00:17:31 UTC 2012
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