src/share/vm/gc_implementation/g1/satbQueue.hpp

Tue, 21 Aug 2012 14:10:39 -0700

author
johnc
date
Tue, 21 Aug 2012 14:10:39 -0700
changeset 3998
7383557659bd
parent 3416
2ace1c4ee8da
child 6396
f99e331f6ef6
permissions
-rw-r--r--

7185699: G1: Prediction model discrepancies
Summary: Correct the result value of G1CollectedHeap::pending_card_num(). Change the code that calculates the GC efficiency of a non-young heap region to use historical data from mixed GCs and the actual number of live bytes when predicting how long it would take to collect the region. Changes were also reviewed by Thomas Schatzl.
Reviewed-by: azeemj, brutisso

ysr@777 1 /*
tonyp@3416 2 * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
ysr@777 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
ysr@777 4 *
ysr@777 5 * This code is free software; you can redistribute it and/or modify it
ysr@777 6 * under the terms of the GNU General Public License version 2 only, as
ysr@777 7 * published by the Free Software Foundation.
ysr@777 8 *
ysr@777 9 * This code is distributed in the hope that it will be useful, but WITHOUT
ysr@777 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
ysr@777 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
ysr@777 12 * version 2 for more details (a copy is included in the LICENSE file that
ysr@777 13 * accompanied this code).
ysr@777 14 *
ysr@777 15 * You should have received a copy of the GNU General Public License version
ysr@777 16 * 2 along with this work; if not, write to the Free Software Foundation,
ysr@777 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
ysr@777 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.
ysr@777 22 *
ysr@777 23 */
ysr@777 24
stefank@2314 25 #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_SATBQUEUE_HPP
stefank@2314 26 #define SHARE_VM_GC_IMPLEMENTATION_G1_SATBQUEUE_HPP
stefank@2314 27
stefank@2314 28 #include "gc_implementation/g1/ptrQueue.hpp"
stefank@2314 29
ysr@777 30 class ObjectClosure;
ysr@777 31 class JavaThread;
tonyp@3416 32 class SATBMarkQueueSet;
ysr@777 33
ysr@777 34 // A ptrQueue whose elements are "oops", pointers to object heads.
ysr@777 35 class ObjPtrQueue: public PtrQueue {
tonyp@3416 36 friend class SATBMarkQueueSet;
tonyp@3416 37
tonyp@3416 38 private:
tonyp@3416 39 // Filter out unwanted entries from the buffer.
tonyp@3416 40 void filter();
tonyp@3416 41
tonyp@3416 42 // Apply the closure to all elements.
tonyp@3416 43 void apply_closure(ObjectClosure* cl);
tonyp@3416 44
tonyp@3416 45 // Apply the closure to all elements and empty the buffer;
tonyp@3416 46 void apply_closure_and_empty(ObjectClosure* cl);
tonyp@3416 47
tonyp@3416 48 // Apply the closure to all elements of "buf", down to "index" (inclusive.)
tonyp@3416 49 static void apply_closure_to_buffer(ObjectClosure* cl,
tonyp@3416 50 void** buf, size_t index, size_t sz);
tonyp@3416 51
ysr@777 52 public:
tonyp@2469 53 ObjPtrQueue(PtrQueueSet* qset, bool perm = false) :
tonyp@2197 54 // SATB queues are only active during marking cycles. We create
tonyp@2197 55 // them with their active field set to false. If a thread is
tonyp@2197 56 // created during a cycle and its SATB queue needs to be activated
tonyp@2197 57 // before the thread starts running, we'll need to set its active
tonyp@2197 58 // field to true. This is done in JavaThread::initialize_queues().
tonyp@2469 59 PtrQueue(qset, perm, false /* active */) { }
tonyp@2469 60
tonyp@3416 61 // Overrides PtrQueue::flush() so that it can filter the buffer
tonyp@3416 62 // before it is flushed.
tonyp@3416 63 virtual void flush();
tonyp@3416 64
tonyp@2469 65 // Overrides PtrQueue::should_enqueue_buffer(). See the method's
tonyp@2469 66 // definition for more information.
tonyp@2469 67 virtual bool should_enqueue_buffer();
tonyp@2469 68
tonyp@3416 69 #ifndef PRODUCT
tonyp@3416 70 // Helpful for debugging
tonyp@3416 71 void print(const char* name);
tonyp@3416 72 static void print(const char* name, void** buf, size_t index, size_t sz);
tonyp@3416 73 #endif // PRODUCT
ysr@777 74
ysr@1280 75 void verify_oops_in_buffer() NOT_DEBUG_RETURN;
ysr@777 76 };
ysr@777 77
ysr@777 78 class SATBMarkQueueSet: public PtrQueueSet {
ysr@777 79 ObjectClosure* _closure;
ysr@777 80 ObjectClosure** _par_closures; // One per ParGCThread.
ysr@777 81
ysr@777 82 ObjPtrQueue _shared_satb_queue;
ysr@777 83
ysr@777 84 // Utility function to support sequential and parallel versions. If
ysr@777 85 // "par" is true, then "worker" is the par thread id; if "false", worker
ysr@777 86 // is ignored.
ysr@777 87 bool apply_closure_to_completed_buffer_work(bool par, int worker);
ysr@777 88
tonyp@1752 89 #ifdef ASSERT
tonyp@1752 90 void dump_active_values(JavaThread* first, bool expected_active);
tonyp@1752 91 #endif // ASSERT
ysr@777 92
ysr@777 93 public:
ysr@777 94 SATBMarkQueueSet();
ysr@777 95
ysr@777 96 void initialize(Monitor* cbl_mon, Mutex* fl_lock,
iveresov@1546 97 int process_completed_threshold,
iveresov@1546 98 Mutex* lock);
ysr@777 99
ysr@777 100 static void handle_zero_index_for_thread(JavaThread* t);
ysr@777 101
tonyp@1752 102 // Apply "set_active(b)" to all Java threads' SATB queues. It should be
tonyp@1752 103 // called only with the world stopped. The method will assert that the
tonyp@1752 104 // SATB queues of all threads it visits, as well as the SATB queue
tonyp@1752 105 // set itself, has an active value same as expected_active.
tonyp@1752 106 void set_active_all_threads(bool b, bool expected_active);
ysr@777 107
tonyp@3416 108 // Filter all the currently-active SATB buffers.
tonyp@3416 109 void filter_thread_buffers();
tonyp@3416 110
ysr@777 111 // Register "blk" as "the closure" for all queues. Only one such closure
ysr@777 112 // is allowed. The "apply_closure_to_completed_buffer" method will apply
ysr@777 113 // this closure to a completed buffer, and "iterate_closure_all_threads"
ysr@777 114 // applies it to partially-filled buffers (the latter should only be done
ysr@777 115 // with the world stopped).
ysr@777 116 void set_closure(ObjectClosure* closure);
ysr@777 117 // Set the parallel closures: pointer is an array of pointers to
ysr@777 118 // closures, one for each parallel GC thread.
ysr@777 119 void set_par_closure(int i, ObjectClosure* closure);
ysr@777 120
tonyp@3416 121 // Apply the registered closure to all entries on each
tonyp@3416 122 // currently-active buffer and then empty the buffer. It should only
tonyp@3416 123 // be called serially and at a safepoint.
ysr@777 124 void iterate_closure_all_threads();
ysr@777 125 // Parallel version of the above.
ysr@777 126 void par_iterate_closure_all_threads(int worker);
ysr@777 127
ysr@777 128 // If there exists some completed buffer, pop it, then apply the
ysr@777 129 // registered closure to all its elements, and return true. If no
ysr@777 130 // completed buffers exist, return false.
ysr@777 131 bool apply_closure_to_completed_buffer() {
ysr@777 132 return apply_closure_to_completed_buffer_work(false, 0);
ysr@777 133 }
ysr@777 134 // Parallel version of the above.
ysr@777 135 bool par_apply_closure_to_completed_buffer(int worker) {
ysr@777 136 return apply_closure_to_completed_buffer_work(true, worker);
ysr@777 137 }
ysr@777 138
tonyp@3416 139 // Apply the given closure on enqueued and currently-active buffers
tonyp@3416 140 // respectively. Both methods are read-only, i.e., they do not
tonyp@3416 141 // modify any of the buffers.
tonyp@3416 142 void iterate_completed_buffers_read_only(ObjectClosure* cl);
tonyp@3416 143 void iterate_thread_buffers_read_only(ObjectClosure* cl);
tonyp@3416 144
tonyp@3416 145 #ifndef PRODUCT
tonyp@3416 146 // Helpful for debugging
tonyp@3416 147 void print_all(const char* msg);
tonyp@3416 148 #endif // PRODUCT
tonyp@3416 149
ysr@777 150 ObjPtrQueue* shared_satb_queue() { return &_shared_satb_queue; }
ysr@777 151
ysr@777 152 // If a marking is being abandoned, reset any unprocessed log buffers.
ysr@777 153 void abandon_partial_marking();
ysr@777 154 };
stefank@2314 155
stefank@2314 156 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_SATBQUEUE_HPP

mercurial