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

Fri, 10 Oct 2014 15:51:58 +0200

author
tschatzl
date
Fri, 10 Oct 2014 15:51:58 +0200
changeset 7257
e7d0505c8a30
parent 6992
2c6ef90f030a
child 7476
c2844108a708
permissions
-rw-r--r--

8059758: Footprint regressions with JDK-8038423
Summary: Changes in JDK-8038423 always initialize (zero out) virtual memory used for auxiliary data structures. This causes a footprint regression for G1 in startup benchmarks. This is because they do not touch that memory at all, so the operating system does not actually commit these pages. The fix is to, if the initialization value of the data structures matches the default value of just committed memory (=0), do not do anything.
Reviewed-by: jwilhelm, 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 {
stefank@6992 36 friend class Threads;
tonyp@3416 37 friend class SATBMarkQueueSet;
stefank@6992 38 friend class G1RemarkThreadsClosure;
tonyp@3416 39
tonyp@3416 40 private:
tonyp@3416 41 // Filter out unwanted entries from the buffer.
tonyp@3416 42 void filter();
tonyp@3416 43
tonyp@3416 44 // Apply the closure to all elements.
tonyp@3416 45 void apply_closure(ObjectClosure* cl);
tonyp@3416 46
tonyp@3416 47 // Apply the closure to all elements and empty the buffer;
tonyp@3416 48 void apply_closure_and_empty(ObjectClosure* cl);
tonyp@3416 49
tonyp@3416 50 // Apply the closure to all elements of "buf", down to "index" (inclusive.)
tonyp@3416 51 static void apply_closure_to_buffer(ObjectClosure* cl,
tonyp@3416 52 void** buf, size_t index, size_t sz);
tonyp@3416 53
ysr@777 54 public:
tonyp@2469 55 ObjPtrQueue(PtrQueueSet* qset, bool perm = false) :
tonyp@2197 56 // SATB queues are only active during marking cycles. We create
tonyp@2197 57 // them with their active field set to false. If a thread is
tonyp@2197 58 // created during a cycle and its SATB queue needs to be activated
tonyp@2197 59 // before the thread starts running, we'll need to set its active
tonyp@2197 60 // field to true. This is done in JavaThread::initialize_queues().
tonyp@2469 61 PtrQueue(qset, perm, false /* active */) { }
tonyp@2469 62
tonyp@3416 63 // Overrides PtrQueue::flush() so that it can filter the buffer
tonyp@3416 64 // before it is flushed.
tonyp@3416 65 virtual void flush();
tonyp@3416 66
tonyp@2469 67 // Overrides PtrQueue::should_enqueue_buffer(). See the method's
tonyp@2469 68 // definition for more information.
tonyp@2469 69 virtual bool should_enqueue_buffer();
tonyp@2469 70
tonyp@3416 71 #ifndef PRODUCT
tonyp@3416 72 // Helpful for debugging
tonyp@3416 73 void print(const char* name);
tonyp@3416 74 static void print(const char* name, void** buf, size_t index, size_t sz);
tonyp@3416 75 #endif // PRODUCT
ysr@777 76
ysr@1280 77 void verify_oops_in_buffer() NOT_DEBUG_RETURN;
ysr@777 78 };
ysr@777 79
ysr@777 80 class SATBMarkQueueSet: public PtrQueueSet {
ysr@777 81 ObjectClosure* _closure;
ysr@777 82 ObjectClosure** _par_closures; // One per ParGCThread.
ysr@777 83
ysr@777 84 ObjPtrQueue _shared_satb_queue;
ysr@777 85
ysr@777 86 // Utility function to support sequential and parallel versions. If
ysr@777 87 // "par" is true, then "worker" is the par thread id; if "false", worker
ysr@777 88 // is ignored.
vkempik@6552 89 bool apply_closure_to_completed_buffer_work(bool par, uint worker);
ysr@777 90
tonyp@1752 91 #ifdef ASSERT
pliden@6396 92 void dump_active_states(bool expected_active);
pliden@6396 93 void verify_active_states(bool expected_active);
tonyp@1752 94 #endif // ASSERT
ysr@777 95
ysr@777 96 public:
ysr@777 97 SATBMarkQueueSet();
ysr@777 98
ysr@777 99 void initialize(Monitor* cbl_mon, Mutex* fl_lock,
iveresov@1546 100 int process_completed_threshold,
iveresov@1546 101 Mutex* lock);
ysr@777 102
ysr@777 103 static void handle_zero_index_for_thread(JavaThread* t);
ysr@777 104
pliden@6396 105 // Apply "set_active(active)" to all SATB queues in the set. It should be
tonyp@1752 106 // called only with the world stopped. The method will assert that the
tonyp@1752 107 // SATB queues of all threads it visits, as well as the SATB queue
tonyp@1752 108 // set itself, has an active value same as expected_active.
pliden@6396 109 void set_active_all_threads(bool active, bool expected_active);
ysr@777 110
tonyp@3416 111 // Filter all the currently-active SATB buffers.
tonyp@3416 112 void filter_thread_buffers();
tonyp@3416 113
ysr@777 114 // Register "blk" as "the closure" for all queues. Only one such closure
ysr@777 115 // is allowed. The "apply_closure_to_completed_buffer" method will apply
ysr@777 116 // this closure to a completed buffer, and "iterate_closure_all_threads"
ysr@777 117 // applies it to partially-filled buffers (the latter should only be done
ysr@777 118 // with the world stopped).
ysr@777 119 void set_closure(ObjectClosure* closure);
ysr@777 120 // Set the parallel closures: pointer is an array of pointers to
ysr@777 121 // closures, one for each parallel GC thread.
ysr@777 122 void set_par_closure(int i, ObjectClosure* closure);
ysr@777 123
ysr@777 124 // If there exists some completed buffer, pop it, then apply the
ysr@777 125 // registered closure to all its elements, and return true. If no
ysr@777 126 // completed buffers exist, return false.
ysr@777 127 bool apply_closure_to_completed_buffer() {
ysr@777 128 return apply_closure_to_completed_buffer_work(false, 0);
ysr@777 129 }
ysr@777 130 // Parallel version of the above.
vkempik@6552 131 bool par_apply_closure_to_completed_buffer(uint worker) {
ysr@777 132 return apply_closure_to_completed_buffer_work(true, worker);
ysr@777 133 }
ysr@777 134
tonyp@3416 135 // Apply the given closure on enqueued and currently-active buffers
tonyp@3416 136 // respectively. Both methods are read-only, i.e., they do not
tonyp@3416 137 // modify any of the buffers.
tonyp@3416 138 void iterate_completed_buffers_read_only(ObjectClosure* cl);
tonyp@3416 139 void iterate_thread_buffers_read_only(ObjectClosure* cl);
tonyp@3416 140
tonyp@3416 141 #ifndef PRODUCT
tonyp@3416 142 // Helpful for debugging
tonyp@3416 143 void print_all(const char* msg);
tonyp@3416 144 #endif // PRODUCT
tonyp@3416 145
ysr@777 146 ObjPtrQueue* shared_satb_queue() { return &_shared_satb_queue; }
ysr@777 147
ysr@777 148 // If a marking is being abandoned, reset any unprocessed log buffers.
ysr@777 149 void abandon_partial_marking();
ysr@777 150 };
stefank@2314 151
stefank@2314 152 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_SATBQUEUE_HPP

mercurial