8076463: Add logging for the preserve CM referents task
Summary: Add logging and do minor refactoring to CM referents handling task.
Reviewed-by: jmasa
--- a/hotspot/src/share/vm/gc/g1/g1CollectedHeap.cpp Fri Feb 26 13:02:30 2016 +0100
+++ b/hotspot/src/share/vm/gc/g1/g1CollectedHeap.cpp Fri Feb 26 13:02:30 2016 +0100
@@ -4398,6 +4398,8 @@
{ }
void work(uint worker_id) {
+ G1GCParPhaseTimesTracker x(_g1h->g1_policy()->phase_times(), G1GCPhaseTimes::PreserveCMReferents, worker_id);
+
ResourceMark rm;
HandleMark hm;
@@ -4461,13 +4463,8 @@
g1_policy()->phase_times()->record_ref_proc_time(ref_proc_time * 1000.0);
}
-// Weak Reference processing during an evacuation pause (part 1).
-void G1CollectedHeap::process_discovered_references(G1ParScanThreadStateSet* per_thread_states) {
- double ref_proc_start = os::elapsedTime();
-
- ReferenceProcessor* rp = _ref_processor_stw;
- assert(rp->discovery_enabled(), "should have been enabled");
-
+void G1CollectedHeap::preserve_cm_referents(G1ParScanThreadStateSet* per_thread_states) {
+ double preserve_cm_referents_start = os::elapsedTime();
// Any reference objects, in the collection set, that were 'discovered'
// by the CM ref processor should have already been copied (either by
// applying the external root copy closure to the discovered lists, or
@@ -4495,9 +4492,18 @@
per_thread_states,
no_of_gc_workers,
_task_queues);
-
workers()->run_task(&keep_cm_referents);
+ g1_policy()->phase_times()->record_preserve_cm_referents_time_ms((os::elapsedTime() - preserve_cm_referents_start) * 1000.0);
+}
+
+// Weak Reference processing during an evacuation pause (part 1).
+void G1CollectedHeap::process_discovered_references(G1ParScanThreadStateSet* per_thread_states) {
+ double ref_proc_start = os::elapsedTime();
+
+ ReferenceProcessor* rp = _ref_processor_stw;
+ assert(rp->discovery_enabled(), "should have been enabled");
+
// Closure to test whether a referent is alive.
G1STWIsAliveClosure is_alive(this);
@@ -4529,6 +4535,8 @@
NULL,
_gc_timer_stw);
} else {
+ uint no_of_gc_workers = workers()->active_workers();
+
// Parallel reference processing
assert(rp->num_q() == no_of_gc_workers, "sanity");
assert(no_of_gc_workers <= rp->max_num_q(), "sanity");
@@ -4644,6 +4652,7 @@
// objects (and their reachable sub-graphs) that were
// not copied during the pause.
if (g1_policy()->should_process_references()) {
+ preserve_cm_referents(per_thread_states);
process_discovered_references(per_thread_states);
} else {
ref_processor_stw()->verify_no_references_recorded();
--- a/hotspot/src/share/vm/gc/g1/g1CollectedHeap.hpp Fri Feb 26 13:02:30 2016 +0100
+++ b/hotspot/src/share/vm/gc/g1/g1CollectedHeap.hpp Fri Feb 26 13:02:30 2016 +0100
@@ -511,6 +511,9 @@
// allocated block, or else "NULL".
HeapWord* expand_and_allocate(size_t word_size, AllocationContext_t context);
+ // Preserve any referents discovered by concurrent marking that have not yet been
+ // copied by the STW pause.
+ void preserve_cm_referents(G1ParScanThreadStateSet* per_thread_states);
// Process any reference objects discovered during
// an incremental evacuation pause.
void process_discovered_references(G1ParScanThreadStateSet* per_thread_states);
--- a/hotspot/src/share/vm/gc/g1/g1GCPhaseTimes.cpp Fri Feb 26 13:02:30 2016 +0100
+++ b/hotspot/src/share/vm/gc/g1/g1GCPhaseTimes.cpp Fri Feb 26 13:02:30 2016 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -129,6 +129,8 @@
_gc_par_phases[RedirtyCards] = new WorkerDataArray<double>(max_gc_threads, "Parallel Redirty:", true, 3);
_redirtied_cards = new WorkerDataArray<size_t>(max_gc_threads, "Redirtied Cards:", true, 3);
_gc_par_phases[RedirtyCards]->link_thread_work_items(_redirtied_cards);
+
+ _gc_par_phases[PreserveCMReferents] = new WorkerDataArray<double>(max_gc_threads, "Parallel Preserve CM Refs:", true, 3);
}
void G1GCPhaseTimes::note_gc_start(uint active_gc_threads) {
@@ -392,10 +394,12 @@
print_stats(Indents[2], "Choose CSet",
(_recorded_young_cset_choice_time_ms +
_recorded_non_young_cset_choice_time_ms));
+ print_stats(Indents[2], "Preserve CM Refs", _recorded_preserve_cm_referents_time_ms);
print_stats(Indents[2], "Ref Proc", _cur_ref_proc_time_ms);
print_stats(Indents[2], "Ref Enq", _cur_ref_enq_time_ms);
print_stats(Indents[2], "Redirty Cards", _recorded_redirty_logged_cards_time_ms);
par_phase_printer.print(RedirtyCards);
+ par_phase_printer.print(PreserveCMReferents);
if (G1EagerReclaimHumongousObjects) {
print_stats(Indents[2], "Humongous Register", _cur_fast_reclaim_humongous_register_time_ms);
--- a/hotspot/src/share/vm/gc/g1/g1GCPhaseTimes.hpp Fri Feb 26 13:02:30 2016 +0100
+++ b/hotspot/src/share/vm/gc/g1/g1GCPhaseTimes.hpp Fri Feb 26 13:02:30 2016 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -69,6 +69,7 @@
StringDedupQueueFixup,
StringDedupTableFixup,
RedirtyCards,
+ PreserveCMReferents,
GCParPhasesSentinel
};
@@ -108,6 +109,8 @@
double _recorded_redirty_logged_cards_time_ms;
+ double _recorded_preserve_cm_referents_time_ms;
+
double _recorded_young_free_cset_time_ms;
double _recorded_non_young_free_cset_time_ms;
@@ -234,6 +237,10 @@
_recorded_redirty_logged_cards_time_ms = time_ms;
}
+ void record_preserve_cm_referents_time_ms(double time_ms) {
+ _recorded_preserve_cm_referents_time_ms = time_ms;
+ }
+
void record_cur_collection_start_sec(double time_ms) {
_cur_collection_start_sec = time_ms;
}
--- a/hotspot/test/gc/g1/TestGCLogMessages.java Fri Feb 26 13:02:30 2016 +0100
+++ b/hotspot/test/gc/g1/TestGCLogMessages.java Fri Feb 26 13:02:30 2016 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
/*
* @test TestGCLogMessages
- * @bug 8035406 8027295 8035398 8019342 8027959 8048179 8027962 8069330
+ * @bug 8035406 8027295 8035398 8019342 8027959 8048179 8027962 8069330 8076463
* @summary Ensure the output for a minor GC with G1
* includes the expected necessary messages.
* @key gc
@@ -86,6 +86,8 @@
// Humongous Eager Reclaim
new LogMessageWithLevel("Humongous Reclaim", Level.DEBUG),
new LogMessageWithLevel("Humongous Register", Level.DEBUG),
+ // Preserve CM Referents
+ new LogMessageWithLevel("Preserve CM Refs", Level.DEBUG),
};
void checkMessagesAtLevel(OutputAnalyzer output, LogMessageWithLevel messages[], Level level) throws Exception {