< prev index next >
src/share/vm/gc/shared/genCollectedHeap.cpp
Print this page
*** 312,354 ****
}
void GenCollectedHeap::collect_generation(Generation* gen, bool full, size_t size,
bool is_tlab, bool run_verification, bool clear_soft_refs,
bool restore_marks_for_biased_locking) {
! // Timer for individual generations. Last argument is false: no CR
! // FIXME: We should try to start the timing earlier to cover more of the GC pause
! GCTraceTime t1(gen->short_name(), PrintGCDetails, false, NULL);
TraceCollectorStats tcs(gen->counters());
TraceMemoryManagerStats tmms(gen->kind(),gc_cause());
- size_t prev_used = gen->used();
gen->stat_record()->invocations++;
gen->stat_record()->accumulated_time.start();
// Must be done anew before each collection because
// a previous collection will do mangling and will
// change top of some spaces.
record_gen_tops_before_GC();
! if (PrintGC && Verbose) {
! // I didn't want to change the logging when removing the level concept,
! // but I guess this logging could say young/old or something instead of 0/1.
! uint level;
! if (heap()->is_young_gen(gen)) {
! level = 0;
! } else {
! level = 1;
! }
! gclog_or_tty->print("level=%u invoke=%d size=" SIZE_FORMAT,
! level,
! gen->stat_record()->invocations,
! size * HeapWordSize);
! }
if (run_verification && VerifyBeforeGC) {
HandleMark hm; // Discard invalid handles created during verification
! Universe::verify(" VerifyBeforeGC:");
}
COMPILER2_PRESENT(DerivedPointerTable::clear());
if (restore_marks_for_biased_locking) {
// We perform this mark word preservation work lazily
--- 312,339 ----
}
void GenCollectedHeap::collect_generation(Generation* gen, bool full, size_t size,
bool is_tlab, bool run_verification, bool clear_soft_refs,
bool restore_marks_for_biased_locking) {
! FormatBuffer<> title("Collect gen: %s", gen->short_name());
! GCTraceTime(Debug, gc) t1(title);
TraceCollectorStats tcs(gen->counters());
TraceMemoryManagerStats tmms(gen->kind(),gc_cause());
gen->stat_record()->invocations++;
gen->stat_record()->accumulated_time.start();
// Must be done anew before each collection because
// a previous collection will do mangling and will
// change top of some spaces.
record_gen_tops_before_GC();
! log_trace(gc)("%s invoke=%d size=" SIZE_FORMAT, heap()->is_young_gen(gen) ? "Young" : "Old", gen->stat_record()->invocations, size * HeapWordSize);
if (run_verification && VerifyBeforeGC) {
HandleMark hm; // Discard invalid handles created during verification
! Universe::verify("Before GC");
}
COMPILER2_PRESENT(DerivedPointerTable::clear());
if (restore_marks_for_biased_locking) {
// We perform this mark word preservation work lazily
*** 402,417 ****
update_gc_stats(gen, full);
if (run_verification && VerifyAfterGC) {
HandleMark hm; // Discard invalid handles created during verification
! Universe::verify(" VerifyAfterGC:");
! }
!
! if (PrintGCDetails) {
! gclog_or_tty->print(":");
! gen->print_heap_change(prev_used);
}
}
void GenCollectedHeap::do_collection(bool full,
bool clear_all_soft_refs,
--- 387,397 ----
update_gc_stats(gen, full);
if (run_verification && VerifyAfterGC) {
HandleMark hm; // Discard invalid handles created during verification
! Universe::verify("After GC");
}
}
void GenCollectedHeap::do_collection(bool full,
bool clear_all_soft_refs,
*** 446,470 ****
{
FlagSetting fl(_is_gc_active, true);
bool complete = full && (max_generation == OldGen);
! const char* gc_cause_prefix = complete ? "Full GC" : "GC";
! TraceCPUTime tcpu(PrintGCDetails, true, gclog_or_tty);
! GCTraceTime t(GCCauseString(gc_cause_prefix, gc_cause()), PrintGCDetails, false, NULL);
gc_prologue(complete);
increment_total_collections(complete);
! size_t gch_prev_used = used();
bool run_verification = total_collections() >= VerifyGCStartAt;
bool prepared_for_verification = false;
bool collected_old = false;
- bool old_collects_young = complete && !ScavengeBeforeFullGC;
! if (!old_collects_young && _young_gen->should_collect(full, size, is_tlab)) {
if (run_verification && VerifyGCLevel <= 0 && VerifyBeforeGC) {
prepare_for_verify();
prepared_for_verification = true;
}
--- 426,460 ----
{
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;
}
*** 485,495 ****
}
bool must_restore_marks_for_biased_locking = false;
if (max_generation == OldGen && _old_gen->should_collect(full, size, is_tlab)) {
- GCIdMarkAndRestore gc_id_mark;
if (!complete) {
// The full_collections increment was missed above.
increment_total_full_collections();
}
--- 475,484 ----
*** 499,515 ****
VerifyGCLevel <= 1 && VerifyBeforeGC) {
prepare_for_verify();
}
assert(_old_gen->performs_in_place_marking(), "All old generations do in place marking");
! 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;
}
--- 488,506 ----
VerifyGCLevel <= 1 && VerifyBeforeGC) {
prepare_for_verify();
}
assert(_old_gen->performs_in_place_marking(), "All old generations do in place marking");
!
! if (do_young_collection) {
! // We did a young GC. Need a new GC id for the old GC.
! GCIdMarkAndRestore gc_id_mark;
! 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;
}
*** 521,538 ****
if (complete) { // We did a full collection
// FIXME: See comment at pre_full_gc_dump call
post_full_gc_dump(NULL); // do any post full gc dumps
}
! if (PrintGCDetails) {
! print_heap_change(gch_prev_used);
!
! // Print metaspace info for full GC with PrintGCDetails flag.
! if (complete) {
MetaspaceAux::print_metaspace_change(metadata_prev_used);
- }
- }
// Adjust generation sizes.
if (collected_old) {
_old_gen->compute_new_size();
}
--- 512,523 ----
if (complete) { // We did a full collection
// FIXME: See comment at pre_full_gc_dump call
post_full_gc_dump(NULL); // do any post full gc dumps
}
! print_heap_change(young_prev_used, old_prev_used);
MetaspaceAux::print_metaspace_change(metadata_prev_used);
// Adjust generation sizes.
if (collected_old) {
_old_gen->compute_new_size();
}
*** 872,885 ****
// Hack XXX FIX ME !!!
// A scavenge may not have been attempted, or may have
// been attempted and failed, because the old gen was too full
if (local_last_generation == YoungGen && gc_cause() == GCCause::_gc_locker &&
incremental_collection_will_fail(false /* don't consult_young */)) {
! if (PrintGCDetails) {
! gclog_or_tty->print_cr("GC locker: Trying a full collection "
! "because scavenge failed");
! }
// This time allow the old gen to be collected as well
do_collection(true, // full
clear_all_soft_refs, // clear_all_soft_refs
0, // size
false, // is_tlab
--- 857,867 ----
// Hack XXX FIX ME !!!
// A scavenge may not have been attempted, or may have
// been attempted and failed, because the old gen was too full
if (local_last_generation == YoungGen && gc_cause() == GCCause::_gc_locker &&
incremental_collection_will_fail(false /* don't consult_young */)) {
! log_debug(gc, jni)("GC locker: Trying a full collection because scavenge failed");
// This time allow the old gen to be collected as well
do_collection(true, // full
clear_all_soft_refs, // clear_all_soft_refs
0, // size
false, // is_tlab
*** 1104,1129 ****
CompactPoint cp(_old_gen);
_old_gen->prepare_for_compaction(&cp);
_young_gen->prepare_for_compaction(&cp);
}
! void GenCollectedHeap::verify(bool silent, VerifyOption option /* ignored */) {
! if (!silent) {
! gclog_or_tty->print("%s", _old_gen->name());
! gclog_or_tty->print(" ");
! }
_old_gen->verify();
! if (!silent) {
! gclog_or_tty->print("%s", _young_gen->name());
! gclog_or_tty->print(" ");
! }
_young_gen->verify();
! if (!silent) {
! gclog_or_tty->print("remset ");
! }
rem_set()->verify();
}
void GenCollectedHeap::print_on(outputStream* st) const {
_young_gen->print_on(st);
--- 1086,1103 ----
CompactPoint cp(_old_gen);
_old_gen->prepare_for_compaction(&cp);
_young_gen->prepare_for_compaction(&cp);
}
! void GenCollectedHeap::verify(VerifyOption option /* ignored */) {
! log_debug(gc, verify)("%s", _old_gen->name());
_old_gen->verify();
! log_debug(gc, verify)("%s", _old_gen->name());
_young_gen->verify();
! log_debug(gc, verify)("RemSet");
rem_set()->verify();
}
void GenCollectedHeap::print_on(outputStream* st) const {
_young_gen->print_on(st);
*** 1169,1190 ****
if (TraceOldGenTime) {
_old_gen->print_summary_info();
}
}
! void GenCollectedHeap::print_heap_change(size_t prev_used) const {
! if (PrintGCDetails && Verbose) {
! gclog_or_tty->print(" " SIZE_FORMAT
! "->" SIZE_FORMAT
! "(" SIZE_FORMAT ")",
! prev_used, used(), capacity());
! } else {
! gclog_or_tty->print(" " SIZE_FORMAT "K"
! "->" SIZE_FORMAT "K"
! "(" SIZE_FORMAT "K)",
! prev_used / K, used() / K, capacity() / K);
! }
}
class GenGCPrologueClosure: public GenCollectedHeap::GenClosure {
private:
bool _full;
--- 1143,1157 ----
if (TraceOldGenTime) {
_old_gen->print_summary_info();
}
}
! void GenCollectedHeap::print_heap_change(size_t young_prev_used, size_t old_prev_used) const {
! log_info(gc, heap)("%s: " SIZE_FORMAT "K->" SIZE_FORMAT "K(" SIZE_FORMAT "K)",
! _young_gen->short_name(), young_prev_used / K, _young_gen->used() /K, _young_gen->capacity() /K);
! log_info(gc, heap)("%s: " SIZE_FORMAT "K->" SIZE_FORMAT "K(" SIZE_FORMAT "K)",
! _old_gen->short_name(), old_prev_used / K, _old_gen->used() /K, _old_gen->capacity() /K);
}
class GenGCPrologueClosure: public GenCollectedHeap::GenClosure {
private:
bool _full;
< prev index next >