< prev index next >
src/hotspot/share/gc/shared/genCollectedHeap.cpp
Print this page
rev 53464 : 8215221: Serial GC misreports young GC time
Reviewed-by: XXX
*** 555,609 ****
if (GCLocker::check_active_before_gc()) {
return; // GC is disabled (e.g. JNI GetXXXCritical operation)
}
- GCIdMark gc_id_mark;
-
const bool do_clear_all_soft_refs = clear_all_soft_refs ||
soft_ref_policy()->should_clear_all_soft_refs();
ClearedAllSoftRefs casr(do_clear_all_soft_refs, soft_ref_policy());
const size_t metadata_prev_used = MetaspaceUtils::used_bytes();
- print_heap_before_gc();
- {
FlagSetting fl(_is_gc_active, true);
bool complete = full && (max_generation == OldGen);
bool old_collects_young = complete && !ScavengeBeforeFullGC;
bool do_young_collection = !old_collects_young && _young_gen->should_collect(full, size, is_tlab);
- FormatBuffer<> gc_string("%s", "Pause ");
- if (do_young_collection) {
- gc_string.append("Young");
- } else {
- gc_string.append("Full");
- }
-
- GCTraceCPUTime tcpu;
- GCTraceTime(Info, gc) t(gc_string, NULL, gc_cause(), true);
-
- gc_prologue(complete);
- increment_total_collections(complete);
-
size_t young_prev_used = _young_gen->used();
size_t old_prev_used = _old_gen->used();
bool run_verification = total_collections() >= VerifyGCStartAt;
-
bool prepared_for_verification = false;
! bool collected_old = false;
if (do_young_collection) {
if (run_verification && VerifyGCLevel <= 0 && VerifyBeforeGC) {
prepare_for_verify();
prepared_for_verification = true;
}
collect_generation(_young_gen,
full,
size,
is_tlab,
run_verification && VerifyGCLevel <= 0,
--- 555,600 ----
if (GCLocker::check_active_before_gc()) {
return; // GC is disabled (e.g. JNI GetXXXCritical operation)
}
const bool do_clear_all_soft_refs = clear_all_soft_refs ||
soft_ref_policy()->should_clear_all_soft_refs();
ClearedAllSoftRefs casr(do_clear_all_soft_refs, soft_ref_policy());
const size_t metadata_prev_used = MetaspaceUtils::used_bytes();
FlagSetting fl(_is_gc_active, true);
bool complete = full && (max_generation == OldGen);
bool old_collects_young = complete && !ScavengeBeforeFullGC;
bool do_young_collection = !old_collects_young && _young_gen->should_collect(full, size, is_tlab);
size_t young_prev_used = _young_gen->used();
size_t old_prev_used = _old_gen->used();
bool run_verification = total_collections() >= VerifyGCStartAt;
bool prepared_for_verification = false;
! bool do_full_collection = false;
if (do_young_collection) {
+ GCIdMark gc_id_mark;
+ GCTraceCPUTime tcpu;
+ GCTraceTime(Info, gc) t("Pause Young", NULL, gc_cause(), true);
+
+ print_heap_before_gc();
+
if (run_verification && VerifyGCLevel <= 0 && VerifyBeforeGC) {
prepare_for_verify();
prepared_for_verification = true;
}
+ gc_prologue(complete);
+ increment_total_collections(complete);
+
collect_generation(_young_gen,
full,
size,
is_tlab,
run_verification && VerifyGCLevel <= 0,
*** 613,691 ****
if (size > 0 && (!is_tlab || _young_gen->supports_tlab_allocation()) &&
size * HeapWordSize <= _young_gen->unsafe_max_alloc_nogc()) {
// Allocation request was met by young GC.
size = 0;
}
- }
! bool must_restore_marks_for_biased_locking = false;
! if (max_generation == OldGen && _old_gen->should_collect(full, size, is_tlab)) {
! if (!complete) {
! // The full_collections increment was missed above.
! increment_total_full_collections();
}
! if (!prepared_for_verification && run_verification &&
! VerifyGCLevel <= 1 && VerifyBeforeGC) {
! prepare_for_verify();
}
! if (do_young_collection) {
! // We did a young GC. Need a new GC id for the old GC.
GCIdMark gc_id_mark;
GCTraceTime(Info, gc) t("Pause Full", NULL, gc_cause(), true);
! collect_generation(_old_gen, full, size, is_tlab, run_verification && VerifyGCLevel <= 1, do_clear_all_soft_refs, true);
! } else {
! // No young GC done. Use the same GC id as was set up earlier in this method.
! collect_generation(_old_gen, full, size, is_tlab, run_verification && VerifyGCLevel <= 1, do_clear_all_soft_refs, true);
}
! must_restore_marks_for_biased_locking = true;
! collected_old = true;
}
! // Update "complete" boolean wrt what actually transpired --
! // for instance, a promotion failure could have led to
! // a whole heap collection.
! complete = complete || collected_old;
// Adjust generation sizes.
- if (collected_old) {
_old_gen->compute_new_size();
- }
_young_gen->compute_new_size();
- if (complete) {
// Delete metaspaces for unloaded class loaders and clean up loader_data graph
ClassLoaderDataGraph::purge();
MetaspaceUtils::verify_metrics();
// Resize the metaspace capacity after full collections
MetaspaceGC::compute_new_size();
update_full_collections_completed();
- }
print_heap_change(young_prev_used, old_prev_used);
MetaspaceUtils::print_metaspace_change(metadata_prev_used);
// Track memory usage and detect low memory after GC finishes
MemoryService::track_memory_usage();
gc_epilogue(complete);
- if (must_restore_marks_for_biased_locking) {
BiasedLocking::restore_marks();
- }
- }
print_heap_after_gc();
#ifdef TRACESPINNING
ParallelTaskTerminator::print_termination_counts();
#endif
}
void GenCollectedHeap::register_nmethod(nmethod* nm) {
CodeCache::register_scavenge_root_nmethod(nm);
}
void GenCollectedHeap::verify_nmethod(nmethod* nm) {
--- 604,697 ----
if (size > 0 && (!is_tlab || _young_gen->supports_tlab_allocation()) &&
size * HeapWordSize <= _young_gen->unsafe_max_alloc_nogc()) {
// Allocation request was met by young GC.
size = 0;
}
! // Ask if young collection is enough. If so, do the final steps for young collection,
! // and fallthrough to the end.
! do_full_collection = should_do_full_collection(size, full, is_tlab, max_generation);
! if (!do_full_collection) {
! // Adjust generation sizes.
! _young_gen->compute_new_size();
! print_heap_change(young_prev_used, old_prev_used);
! MetaspaceUtils::print_metaspace_change(metadata_prev_used);
!
! // Track memory usage and detect low memory after GC finishes
! MemoryService::track_memory_usage();
!
! gc_epilogue(complete);
}
! print_heap_after_gc();
!
! } else {
! // No young collection, ask if we need to perform Full collection.
! do_full_collection = should_do_full_collection(size, full, is_tlab, max_generation);
}
! if (do_full_collection) {
GCIdMark gc_id_mark;
+ GCTraceCPUTime tcpu;
GCTraceTime(Info, gc) t("Pause Full", NULL, gc_cause(), true);
!
! print_heap_before_gc();
!
! if (!prepared_for_verification && run_verification &&
! VerifyGCLevel <= 1 && VerifyBeforeGC) {
! prepare_for_verify();
}
! if (!do_young_collection) {
! gc_prologue(complete);
! increment_total_collections();
}
+ increment_total_full_collections();
! collect_generation(_old_gen,
! full,
! size,
! is_tlab,
! run_verification && VerifyGCLevel <= 1,
! do_clear_all_soft_refs,
! true);
// Adjust generation sizes.
_old_gen->compute_new_size();
_young_gen->compute_new_size();
// Delete metaspaces for unloaded class loaders and clean up loader_data graph
ClassLoaderDataGraph::purge();
MetaspaceUtils::verify_metrics();
// Resize the metaspace capacity after full collections
MetaspaceGC::compute_new_size();
update_full_collections_completed();
print_heap_change(young_prev_used, old_prev_used);
MetaspaceUtils::print_metaspace_change(metadata_prev_used);
// Track memory usage and detect low memory after GC finishes
MemoryService::track_memory_usage();
gc_epilogue(complete);
BiasedLocking::restore_marks();
print_heap_after_gc();
+ }
#ifdef TRACESPINNING
ParallelTaskTerminator::print_termination_counts();
#endif
}
+ bool GenCollectedHeap::should_do_full_collection(size_t size, bool full, bool is_tlab,
+ GenCollectedHeap::GenerationType max_gen) const {
+ return max_gen == OldGen && _old_gen->should_collect(full, size, is_tlab);
+ }
+
void GenCollectedHeap::register_nmethod(nmethod* nm) {
CodeCache::register_scavenge_root_nmethod(nm);
}
void GenCollectedHeap::verify_nmethod(nmethod* nm) {
< prev index next >