提交 c908a927 编写于 作者: J johnc

7086533: G1: assert(!_g1->is_obj_dead(obj)): We should not be preserving dead...

7086533: G1: assert(!_g1->is_obj_dead(obj)): We should not be preserving dead objs: g1CollectedHeap.cpp:3835
Summary: Some objects may not be marked in the event of an evacuation failure in a partially young GC, during a marking cycle. Avoid this situation by not allowing partially young GCs during a marking cycle.
Reviewed-by: tonyp, ysr, brutisso
上级 ff51a420
...@@ -3365,6 +3365,14 @@ G1CollectedHeap::do_collection_pause_at_safepoint(double target_pause_time_ms) { ...@@ -3365,6 +3365,14 @@ G1CollectedHeap::do_collection_pause_at_safepoint(double target_pause_time_ms) {
// for the duration of this pause. // for the duration of this pause.
g1_policy()->decide_on_conc_mark_initiation(); g1_policy()->decide_on_conc_mark_initiation();
// We do not allow initial-mark to be piggy-backed on a
// partially-young GC.
assert(!g1_policy()->during_initial_mark_pause() ||
g1_policy()->full_young_gcs(), "sanity");
// We also do not allow partially-young GCs during marking.
assert(!mark_in_progress() || g1_policy()->full_young_gcs(), "sanity");
char verbose_str[128]; char verbose_str[128];
sprintf(verbose_str, "GC pause "); sprintf(verbose_str, "GC pause ");
if (g1_policy()->full_young_gcs()) { if (g1_policy()->full_young_gcs()) {
......
...@@ -1525,11 +1525,17 @@ void G1CollectorPolicy::record_collection_pause_end() { ...@@ -1525,11 +1525,17 @@ void G1CollectorPolicy::record_collection_pause_end() {
} }
if (_last_full_young_gc) { if (_last_full_young_gc) {
ergo_verbose2(ErgoPartiallyYoungGCs, if (!last_pause_included_initial_mark) {
"start partially-young GCs", ergo_verbose2(ErgoPartiallyYoungGCs,
ergo_format_byte_perc("known garbage"), "start partially-young GCs",
_known_garbage_bytes, _known_garbage_ratio * 100.0); ergo_format_byte_perc("known garbage"),
set_full_young_gcs(false); _known_garbage_bytes, _known_garbage_ratio * 100.0);
set_full_young_gcs(false);
} else {
ergo_verbose0(ErgoPartiallyYoungGCs,
"do not start partially-young GCs",
ergo_format_reason("concurrent cycle is about to start"));
}
_last_full_young_gc = false; _last_full_young_gc = false;
} }
...@@ -2491,6 +2497,13 @@ G1CollectorPolicy::decide_on_conc_mark_initiation() { ...@@ -2491,6 +2497,13 @@ G1CollectorPolicy::decide_on_conc_mark_initiation() {
// initiate a new cycle. // initiate a new cycle.
set_during_initial_mark_pause(); set_during_initial_mark_pause();
// We do not allow non-full young GCs during marking.
if (!full_young_gcs()) {
set_full_young_gcs(true);
ergo_verbose0(ErgoPartiallyYoungGCs,
"end partially-young GCs",
ergo_format_reason("concurrent cycle is about to start"));
}
// And we can now clear initiate_conc_mark_if_possible() as // And we can now clear initiate_conc_mark_if_possible() as
// we've already acted on it. // we've already acted on it.
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册