annotate src/share/vm/gc_implementation/g1/g1StringDedupQueue.cpp @ 20504:6948da6d7c13

8052172: Evacuation failure handling in G1 does not evacuate all objects if -XX:-G1DeferredRSUpdate is set Summary: Remove -XX:-G1DeferredRSUpdate functionality as it is racy. During evacuation failure handling, threads where evacuation failure handling occurred may try to add remembered sets to regions which remembered sets are currently being scanned. The iterator to handle the remembered set scan does not support addition of entries during scan and so may skip valid references. Reviewed-by: iveresov, brutisso, mgerdin
author tschatzl
date Tue, 30 Sep 2014 09:44:36 +0200
parents 1772223a25a2
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
17764
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
1 /*
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
2 * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
4 *
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
7 * published by the Free Software Foundation.
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
8 *
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
13 * accompanied this code).
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
14 *
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
18 *
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
21 * questions.
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
22 *
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
23 */
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
24
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
25 #include "precompiled.hpp"
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
26 #include "classfile/javaClasses.hpp"
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
27 #include "gc_implementation/g1/g1StringDedupQueue.hpp"
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
28 #include "memory/gcLocker.hpp"
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
29 #include "runtime/mutexLocker.hpp"
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
30 #include "utilities/stack.inline.hpp"
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
31
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
32 G1StringDedupQueue* G1StringDedupQueue::_queue = NULL;
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
33 const size_t G1StringDedupQueue::_max_size = 1000000; // Max number of elements per queue
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
34 const size_t G1StringDedupQueue::_max_cache_size = 0; // Max cache size per queue
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
35
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
36 G1StringDedupQueue::G1StringDedupQueue() :
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
37 _cursor(0),
17947
1772223a25a2 8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents: 17764
diff changeset
38 _cancel(false),
17764
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
39 _empty(true),
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
40 _dropped(0) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
41 _nqueues = MAX2(ParallelGCThreads, (size_t)1);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
42 _queues = NEW_C_HEAP_ARRAY(G1StringDedupWorkerQueue, _nqueues, mtGC);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
43 for (size_t i = 0; i < _nqueues; i++) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
44 new (_queues + i) G1StringDedupWorkerQueue(G1StringDedupWorkerQueue::default_segment_size(), _max_cache_size, _max_size);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
45 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
46 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
47
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
48 G1StringDedupQueue::~G1StringDedupQueue() {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
49 ShouldNotReachHere();
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
50 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
51
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
52 void G1StringDedupQueue::create() {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
53 assert(_queue == NULL, "One string deduplication queue allowed");
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
54 _queue = new G1StringDedupQueue();
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
55 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
56
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
57 void G1StringDedupQueue::wait() {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
58 MonitorLockerEx ml(StringDedupQueue_lock, Mutex::_no_safepoint_check_flag);
17947
1772223a25a2 8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents: 17764
diff changeset
59 while (_queue->_empty && !_queue->_cancel) {
17764
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
60 ml.wait(Mutex::_no_safepoint_check_flag);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
61 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
62 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
63
17947
1772223a25a2 8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents: 17764
diff changeset
64 void G1StringDedupQueue::cancel_wait() {
1772223a25a2 8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents: 17764
diff changeset
65 MonitorLockerEx ml(StringDedupQueue_lock, Mutex::_no_safepoint_check_flag);
1772223a25a2 8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents: 17764
diff changeset
66 _queue->_cancel = true;
1772223a25a2 8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents: 17764
diff changeset
67 ml.notify();
1772223a25a2 8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents: 17764
diff changeset
68 }
1772223a25a2 8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents: 17764
diff changeset
69
17764
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
70 void G1StringDedupQueue::push(uint worker_id, oop java_string) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
71 assert(SafepointSynchronize::is_at_safepoint(), "Must be at safepoint");
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
72 assert(worker_id < _queue->_nqueues, "Invalid queue");
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
73
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
74 // Push and notify waiter
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
75 G1StringDedupWorkerQueue& worker_queue = _queue->_queues[worker_id];
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
76 if (!worker_queue.is_full()) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
77 worker_queue.push(java_string);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
78 if (_queue->_empty) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
79 MonitorLockerEx ml(StringDedupQueue_lock, Mutex::_no_safepoint_check_flag);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
80 if (_queue->_empty) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
81 // Mark non-empty and notify waiter
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
82 _queue->_empty = false;
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
83 ml.notify();
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
84 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
85 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
86 } else {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
87 // Queue is full, drop the string and update the statistics
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
88 Atomic::inc_ptr(&_queue->_dropped);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
89 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
90 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
91
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
92 oop G1StringDedupQueue::pop() {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
93 assert(!SafepointSynchronize::is_at_safepoint(), "Must not be at safepoint");
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
94 No_Safepoint_Verifier nsv;
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
95
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
96 // Try all queues before giving up
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
97 for (size_t tries = 0; tries < _queue->_nqueues; tries++) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
98 // The cursor indicates where we left of last time
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
99 G1StringDedupWorkerQueue* queue = &_queue->_queues[_queue->_cursor];
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
100 while (!queue->is_empty()) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
101 oop obj = queue->pop();
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
102 // The oop we pop can be NULL if it was marked
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
103 // dead. Just ignore those and pop the next oop.
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
104 if (obj != NULL) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
105 return obj;
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
106 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
107 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
108
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
109 // Try next queue
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
110 _queue->_cursor = (_queue->_cursor + 1) % _queue->_nqueues;
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
111 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
112
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
113 // Mark empty
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
114 _queue->_empty = true;
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
115
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
116 return NULL;
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
117 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
118
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
119 void G1StringDedupQueue::unlink_or_oops_do(G1StringDedupUnlinkOrOopsDoClosure* cl) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
120 // A worker thread first claims a queue, which ensures exclusive
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
121 // access to that queue, then continues to process it.
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
122 for (;;) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
123 // Grab next queue to scan
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
124 size_t queue = cl->claim_queue();
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
125 if (queue >= _queue->_nqueues) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
126 // End of queues
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
127 break;
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
128 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
129
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
130 // Scan the queue
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
131 unlink_or_oops_do(cl, queue);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
132 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
133 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
134
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
135 void G1StringDedupQueue::unlink_or_oops_do(G1StringDedupUnlinkOrOopsDoClosure* cl, size_t queue) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
136 assert(queue < _queue->_nqueues, "Invalid queue");
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
137 StackIterator<oop, mtGC> iter(_queue->_queues[queue]);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
138 while (!iter.is_empty()) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
139 oop* p = iter.next_addr();
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
140 if (*p != NULL) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
141 if (cl->is_alive(*p)) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
142 cl->keep_alive(p);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
143 } else {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
144 // Clear dead reference
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
145 *p = NULL;
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
146 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
147 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
148 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
149 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
150
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
151 void G1StringDedupQueue::print_statistics(outputStream* st) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
152 st->print_cr(
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
153 " [Queue]\n"
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
154 " [Dropped: "UINTX_FORMAT"]", _queue->_dropped);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
155 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
156
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
157 void G1StringDedupQueue::verify() {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
158 for (size_t i = 0; i < _queue->_nqueues; i++) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
159 StackIterator<oop, mtGC> iter(_queue->_queues[i]);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
160 while (!iter.is_empty()) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
161 oop obj = iter.next();
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
162 if (obj != NULL) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
163 guarantee(Universe::heap()->is_in_reserved(obj), "Object must be on the heap");
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
164 guarantee(!obj->is_forwarded(), "Object must not be forwarded");
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
165 guarantee(java_lang_String::is_instance(obj), "Object must be a String");
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
166 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
167 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
168 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
169 }