< prev index next >

src/share/vm/memory/genCollectedHeap.cpp

Print this page
rev 7742 : [mq]: old_patch
rev 7743 : imported patch new_fix

*** 318,328 **** ((cause == GCCause::_gc_locker && GCLockerInvokesConcurrent) || (cause == GCCause::_java_lang_system_gc && ExplicitGCInvokesConcurrent)); } void GenCollectedHeap::collect_generation(Generation* gen, bool full, size_t size, ! bool is_tlab, bool run_verification, bool clear_soft_refs) { // 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 // The PrintGCDetails logging starts before we have incremented the GC id. We will do that later // so we can assume here that the next GC id is what we want. GCTraceTime t1(gen->short_name(), PrintGCDetails, false, NULL, GCId::peek()); --- 318,329 ---- ((cause == GCCause::_gc_locker && GCLockerInvokesConcurrent) || (cause == GCCause::_java_lang_system_gc && ExplicitGCInvokesConcurrent)); } 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 // The PrintGCDetails logging starts before we have incremented the GC id. We will do that later // so we can assume here that the next GC id is what we want. GCTraceTime t1(gen->short_name(), PrintGCDetails, false, NULL, GCId::peek());
*** 349,358 **** --- 350,367 ---- 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 + // because it's only at this point that we know whether we + // absolutely have to do it; we want to avoid doing it for + // scavenge-only collections where it's unnecessary + BiasedLocking::preserve_marks(); + } + // Do collection work { // Note on ref discovery: For what appear to be historical reasons, // GCH enables and disabled (by enqueing) refs discovery. // In the future this should be moved into the generation's
*** 387,405 **** rp->set_enqueuing_is_done(false); } rp->verify_no_references_recorded(); } - // Determine if allocation request was met. - if (size > 0) { - if (!is_tlab || gen->supports_tlab_allocation()) { - if (size * HeapWordSize <= gen->unsafe_max_alloc_nogc()) { - size = 0; - } - } - } - COMPILER2_PRESENT(DerivedPointerTable::update_pointers()); gen->stat_record()->accumulated_time.stop(); update_gc_stats(gen->level(), full); --- 396,405 ----
*** 460,499 **** size_t gch_prev_used = used(); bool must_restore_marks_for_biased_locking = false; bool run_verification = total_collections() >= VerifyGCStartAt; - if (_young_gen->performs_in_place_marking() || - _old_gen->performs_in_place_marking()) { - // We want to avoid doing this for - // scavenge-only collections where it's unnecessary. - must_restore_marks_for_biased_locking = true; - BiasedLocking::preserve_marks(); - } - bool prepared_for_verification = false; int max_level_collected = 0; ! if (!(full && _old_gen->full_collects_younger_generations()) && _young_gen->should_collect(full, size, is_tlab)) { 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, do_clear_all_soft_refs); } if (max_level == 1 && _old_gen->should_collect(full, size, is_tlab)) { if (!complete) { // The full_collections increment was missed above. increment_total_full_collections(); } pre_full_gc_dump(NULL); // do any pre full gc dumps ! if (run_verification && VerifyGCLevel <= 1 && VerifyBeforeGC) { ! if (!prepared_for_verification) { prepare_for_verify(); } ! } ! collect_generation(_old_gen, full, size, is_tlab, run_verification && VerifyGCLevel <= 1, do_clear_all_soft_refs); max_level_collected = 1; } // Update "complete" boolean wrt what actually transpired -- // for instance, a promotion failure could have led to --- 460,515 ---- size_t gch_prev_used = used(); bool must_restore_marks_for_biased_locking = false; bool run_verification = total_collections() >= VerifyGCStartAt; bool prepared_for_verification = false; int max_level_collected = 0; ! if (!(max_level == 1 && full && _old_gen->full_collects_younger_generations()) && _young_gen->should_collect(full, size, is_tlab)) { if (run_verification && VerifyGCLevel <= 0 && VerifyBeforeGC) { prepare_for_verify(); prepared_for_verification = true; } ! if (_young_gen->performs_in_place_marking()) { ! must_restore_marks_for_biased_locking = true; ! } ! collect_generation(_young_gen, ! full, ! size, ! is_tlab, ! run_verification && VerifyGCLevel <= 0, ! do_clear_all_soft_refs, ! must_restore_marks_for_biased_locking); ! ! 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; } + } + if (max_level == 1 && _old_gen->should_collect(full, size, is_tlab)) { if (!complete) { // The full_collections increment was missed above. increment_total_full_collections(); } pre_full_gc_dump(NULL); // do any pre full gc dumps ! if (!prepared_for_verification && run_verification && ! 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, ! !must_restore_marks_for_biased_locking); ! ! must_restore_marks_for_biased_locking = true; max_level_collected = 1; } // Update "complete" boolean wrt what actually transpired -- // for instance, a promotion failure could have led to
*** 647,661 **** ALL_SINCE_SAVE_MARKS_CLOSURES(GCH_SINCE_SAVE_MARKS_ITERATE_DEFN) #undef GCH_SINCE_SAVE_MARKS_ITERATE_DEFN bool GenCollectedHeap::no_allocs_since_save_marks(int level) { ! if (level == 0) { ! if (!_young_gen->no_allocs_since_save_marks()) return false; } ! if (!_old_gen->no_allocs_since_save_marks()) return false; ! return true; } bool GenCollectedHeap::supports_inline_contig_alloc() const { return _young_gen->supports_inline_contig_alloc(); } --- 663,676 ---- ALL_SINCE_SAVE_MARKS_CLOSURES(GCH_SINCE_SAVE_MARKS_ITERATE_DEFN) #undef GCH_SINCE_SAVE_MARKS_ITERATE_DEFN bool GenCollectedHeap::no_allocs_since_save_marks(int level) { ! if (level == 0 && !_young_gen->no_allocs_since_save_marks()) { ! return false; } ! return _old_gen->no_allocs_since_save_marks(); } bool GenCollectedHeap::supports_inline_contig_alloc() const { return _young_gen->supports_inline_contig_alloc(); }
< prev index next >