src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.hpp

Thu, 22 Sep 2011 10:57:37 -0700

author
johnc
date
Thu, 22 Sep 2011 10:57:37 -0700
changeset 3175
4dfb2df418f2
parent 2314
f95d63e2154a
child 3540
ab4422d0ed59
permissions
-rw-r--r--

6484982: G1: process references during evacuation pauses
Summary: G1 now uses two reference processors - one is used by concurrent marking and the other is used by STW GCs (both full and incremental evacuation pauses). In an evacuation pause, the reference processor is embedded into the closures used to scan objects. Doing so causes causes reference objects to be 'discovered' by the reference processor. At the end of the evacuation pause, these discovered reference objects are processed - preserving (and copying) referent objects (and their reachable graphs) as appropriate.
Reviewed-by: ysr, jwilhelm, brutisso, stefank, tonyp

duke@435 1 /*
stefank@2314 2 * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
duke@435 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
duke@435 4 *
duke@435 5 * This code is free software; you can redistribute it and/or modify it
duke@435 6 * under the terms of the GNU General Public License version 2 only, as
duke@435 7 * published by the Free Software Foundation.
duke@435 8 *
duke@435 9 * This code is distributed in the hope that it will be useful, but WITHOUT
duke@435 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
duke@435 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
duke@435 12 * version 2 for more details (a copy is included in the LICENSE file that
duke@435 13 * accompanied this code).
duke@435 14 *
duke@435 15 * You should have received a copy of the GNU General Public License version
duke@435 16 * 2 along with this work; if not, write to the Free Software Foundation,
duke@435 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
duke@435 18 *
trims@1907 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
trims@1907 20 * or visit www.oracle.com if you need additional information or have any
trims@1907 21 * questions.
duke@435 22 *
duke@435 23 */
duke@435 24
stefank@2314 25 #ifndef SHARE_VM_GC_IMPLEMENTATION_PARALLELSCAVENGE_PSMARKSWEEP_HPP
stefank@2314 26 #define SHARE_VM_GC_IMPLEMENTATION_PARALLELSCAVENGE_PSMARKSWEEP_HPP
stefank@2314 27
stefank@2314 28 #include "gc_implementation/shared/collectorCounters.hpp"
stefank@2314 29 #include "gc_implementation/shared/markSweep.inline.hpp"
stefank@2314 30 #include "utilities/stack.hpp"
stefank@2314 31
duke@435 32 class PSAdaptiveSizePolicy;
duke@435 33 class PSYoungGen;
duke@435 34 class PSOldGen;
duke@435 35
duke@435 36 class PSMarkSweep : public MarkSweep {
duke@435 37 private:
duke@435 38 static elapsedTimer _accumulated_time;
duke@435 39 static unsigned int _total_invocations;
duke@435 40 static jlong _time_of_last_gc; // ms
duke@435 41 static CollectorCounters* _counters;
duke@435 42
duke@435 43 // Closure accessors
duke@435 44 static OopClosure* mark_and_push_closure() { return &MarkSweep::mark_and_push_closure; }
duke@435 45 static VoidClosure* follow_stack_closure() { return (VoidClosure*)&MarkSweep::follow_stack_closure; }
duke@435 46 static OopClosure* adjust_pointer_closure() { return (OopClosure*)&MarkSweep::adjust_pointer_closure; }
duke@435 47 static OopClosure* adjust_root_pointer_closure() { return (OopClosure*)&MarkSweep::adjust_root_pointer_closure; }
duke@435 48 static BoolObjectClosure* is_alive_closure() { return (BoolObjectClosure*)&MarkSweep::is_alive; }
duke@435 49
duke@435 50 debug_only(public:) // Used for PSParallelCompact debugging
duke@435 51 // Mark live objects
duke@435 52 static void mark_sweep_phase1(bool clear_all_softrefs);
duke@435 53 // Calculate new addresses
duke@435 54 static void mark_sweep_phase2();
duke@435 55 debug_only(private:) // End used for PSParallelCompact debugging
duke@435 56 // Update pointers
duke@435 57 static void mark_sweep_phase3();
duke@435 58 // Move objects to new positions
duke@435 59 static void mark_sweep_phase4();
duke@435 60
duke@435 61 debug_only(public:) // Used for PSParallelCompact debugging
duke@435 62 // Temporary data structures for traversal and storing/restoring marks
duke@435 63 static void allocate_stacks();
duke@435 64 static void deallocate_stacks();
duke@435 65 static void set_ref_processor(ReferenceProcessor* rp) { // delete this method
duke@435 66 _ref_processor = rp;
duke@435 67 }
duke@435 68 debug_only(private:) // End used for PSParallelCompact debugging
duke@435 69
duke@435 70 // If objects are left in eden after a collection, try to move the boundary
duke@435 71 // and absorb them into the old gen. Returns true if eden was emptied.
duke@435 72 static bool absorb_live_data_from_eden(PSAdaptiveSizePolicy* size_policy,
duke@435 73 PSYoungGen* young_gen,
duke@435 74 PSOldGen* old_gen);
duke@435 75
duke@435 76 // Reset time since last full gc
duke@435 77 static void reset_millis_since_last_gc();
duke@435 78
duke@435 79 public:
duke@435 80 static void invoke(bool clear_all_softrefs);
duke@435 81 static void invoke_no_policy(bool clear_all_softrefs);
duke@435 82
duke@435 83 static void initialize();
duke@435 84
duke@435 85 // Public accessors
duke@435 86 static elapsedTimer* accumulated_time() { return &_accumulated_time; }
duke@435 87 static unsigned int total_invocations() { return _total_invocations; }
duke@435 88 static CollectorCounters* counters() { return _counters; }
duke@435 89
duke@435 90 // Time since last full gc (in milliseconds)
duke@435 91 static jlong millis_since_last_gc();
duke@435 92 };
stefank@2314 93
stefank@2314 94 #endif // SHARE_VM_GC_IMPLEMENTATION_PARALLELSCAVENGE_PSMARKSWEEP_HPP

mercurial