annotate src/share/vm/gc_implementation/g1/g1StringDedup.cpp @ 20211:82693fb204a5

8038930: G1CodeRootSet::test fails with assert(_num_chunks_handed_out == 0) failed: No elements must have been handed out yet Summary: The test incorrectly assumed that it had been started with no other previous compilation activity. Fix this by allowing multiple code root free chunk lists, and use one separate from the global one to perform the test. Reviewed-by: brutisso
author tschatzl
date Wed, 16 Apr 2014 10:14:50 +0200
parents 1772223a25a2
children c3fcc09c9239
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/g1CollectedHeap.inline.hpp"
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
28 #include "gc_implementation/g1/g1GCPhaseTimes.hpp"
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
29 #include "gc_implementation/g1/g1StringDedup.hpp"
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
30 #include "gc_implementation/g1/g1StringDedupQueue.hpp"
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
31 #include "gc_implementation/g1/g1StringDedupStat.hpp"
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
32 #include "gc_implementation/g1/g1StringDedupTable.hpp"
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
33 #include "gc_implementation/g1/g1StringDedupThread.hpp"
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
34
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
35 bool G1StringDedup::_enabled = false;
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
36
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
37 void G1StringDedup::initialize() {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
38 assert(UseG1GC, "String deduplication only available with G1");
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
39 if (UseStringDeduplication) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
40 _enabled = true;
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
41 G1StringDedupQueue::create();
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
42 G1StringDedupTable::create();
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
43 G1StringDedupThread::create();
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
44 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
45 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
46
17947
1772223a25a2 8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents: 17764
diff changeset
47 void G1StringDedup::stop() {
1772223a25a2 8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents: 17764
diff changeset
48 assert(is_enabled(), "String deduplication not enabled");
1772223a25a2 8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents: 17764
diff changeset
49 G1StringDedupThread::stop();
1772223a25a2 8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents: 17764
diff changeset
50 }
1772223a25a2 8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents: 17764
diff changeset
51
17764
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
52 bool G1StringDedup::is_candidate_from_mark(oop obj) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
53 if (java_lang_String::is_instance(obj)) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
54 bool from_young = G1CollectedHeap::heap()->heap_region_containing_raw(obj)->is_young();
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
55 if (from_young && obj->age() < StringDeduplicationAgeThreshold) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
56 // Candidate found. String is being evacuated from young to old but has not
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
57 // reached the deduplication age threshold, i.e. has not previously been a
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
58 // candidate during its life in the young generation.
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
59 return true;
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
60 }
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 // Not a candidate
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
64 return false;
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
65 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
66
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
67 void G1StringDedup::enqueue_from_mark(oop java_string) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
68 assert(is_enabled(), "String deduplication not enabled");
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
69 if (is_candidate_from_mark(java_string)) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
70 G1StringDedupQueue::push(0 /* worker_id */, java_string);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
71 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
72 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
73
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
74 bool G1StringDedup::is_candidate_from_evacuation(bool from_young, bool to_young, oop obj) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
75 if (from_young && java_lang_String::is_instance(obj)) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
76 if (to_young && obj->age() == StringDeduplicationAgeThreshold) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
77 // Candidate found. String is being evacuated from young to young and just
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
78 // reached the deduplication age threshold.
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
79 return true;
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
80 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
81 if (!to_young && obj->age() < StringDeduplicationAgeThreshold) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
82 // Candidate found. String is being evacuated from young to old but has not
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
83 // reached the deduplication age threshold, i.e. has not previously been a
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
84 // candidate during its life in the young generation.
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
85 return true;
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
86 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
87 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
88
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
89 // Not a candidate
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
90 return false;
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
91 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
92
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
93 void G1StringDedup::enqueue_from_evacuation(bool from_young, bool to_young, uint worker_id, oop java_string) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
94 assert(is_enabled(), "String deduplication not enabled");
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
95 if (is_candidate_from_evacuation(from_young, to_young, java_string)) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
96 G1StringDedupQueue::push(worker_id, java_string);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
97 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
98 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
99
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
100 void G1StringDedup::deduplicate(oop java_string) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
101 assert(is_enabled(), "String deduplication not enabled");
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
102 G1StringDedupStat dummy; // Statistics from this path is never used
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
103 G1StringDedupTable::deduplicate(java_string, dummy);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
104 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
105
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
106 void G1StringDedup::oops_do(OopClosure* keep_alive) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
107 assert(is_enabled(), "String deduplication not enabled");
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
108 unlink_or_oops_do(NULL, keep_alive);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
109 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
110
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
111 void G1StringDedup::unlink(BoolObjectClosure* is_alive) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
112 assert(is_enabled(), "String deduplication not enabled");
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
113 // Don't allow a potential resize or rehash during unlink, as the unlink
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
114 // operation itself might remove enough entries to invalidate such a decision.
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
115 unlink_or_oops_do(is_alive, NULL, false /* allow_resize_and_rehash */);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
116 }
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 // Task for parallel unlink_or_oops_do() operation on the deduplication queue
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
120 // and table.
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
121 //
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
122 class G1StringDedupUnlinkOrOopsDoTask : public AbstractGangTask {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
123 private:
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
124 G1StringDedupUnlinkOrOopsDoClosure _cl;
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
125
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
126 public:
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
127 G1StringDedupUnlinkOrOopsDoTask(BoolObjectClosure* is_alive,
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
128 OopClosure* keep_alive,
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
129 bool allow_resize_and_rehash) :
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
130 AbstractGangTask("G1StringDedupUnlinkOrOopsDoTask"),
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
131 _cl(is_alive, keep_alive, allow_resize_and_rehash) {
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 virtual void work(uint worker_id) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
135 double queue_fixup_start = os::elapsedTime();
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
136 G1StringDedupQueue::unlink_or_oops_do(&_cl);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
137
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
138 double table_fixup_start = os::elapsedTime();
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
139 G1StringDedupTable::unlink_or_oops_do(&_cl, worker_id);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
140
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
141 double queue_fixup_time_ms = (table_fixup_start - queue_fixup_start) * 1000.0;
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
142 double table_fixup_time_ms = (os::elapsedTime() - table_fixup_start) * 1000.0;
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
143 G1CollectorPolicy* g1p = G1CollectedHeap::heap()->g1_policy();
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
144 g1p->phase_times()->record_string_dedup_queue_fixup_worker_time(worker_id, queue_fixup_time_ms);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
145 g1p->phase_times()->record_string_dedup_table_fixup_worker_time(worker_id, table_fixup_time_ms);
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 void G1StringDedup::unlink_or_oops_do(BoolObjectClosure* is_alive, OopClosure* keep_alive, bool allow_resize_and_rehash) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
150 assert(is_enabled(), "String deduplication not enabled");
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
151 G1CollectorPolicy* g1p = G1CollectedHeap::heap()->g1_policy();
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
152 g1p->phase_times()->note_string_dedup_fixup_start();
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
153 double fixup_start = os::elapsedTime();
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
154
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
155 G1StringDedupUnlinkOrOopsDoTask task(is_alive, keep_alive, allow_resize_and_rehash);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
156 if (G1CollectedHeap::use_parallel_gc_threads()) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
157 G1CollectedHeap* g1h = G1CollectedHeap::heap();
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
158 g1h->set_par_threads();
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
159 g1h->workers()->run_task(&task);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
160 g1h->set_par_threads(0);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
161 } else {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
162 task.work(0);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
163 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
164
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
165 double fixup_time_ms = (os::elapsedTime() - fixup_start) * 1000.0;
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
166 g1p->phase_times()->record_string_dedup_fixup_time(fixup_time_ms);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
167 g1p->phase_times()->note_string_dedup_fixup_end();
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
168 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
169
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
170 void G1StringDedup::threads_do(ThreadClosure* tc) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
171 assert(is_enabled(), "String deduplication not enabled");
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
172 tc->do_thread(G1StringDedupThread::thread());
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
173 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
174
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
175 void G1StringDedup::print_worker_threads_on(outputStream* st) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
176 assert(is_enabled(), "String deduplication not enabled");
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
177 G1StringDedupThread::thread()->print_on(st);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
178 st->cr();
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
179 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
180
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
181 void G1StringDedup::verify() {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
182 assert(is_enabled(), "String deduplication not enabled");
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
183 G1StringDedupQueue::verify();
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
184 G1StringDedupTable::verify();
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
185 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
186
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
187 G1StringDedupUnlinkOrOopsDoClosure::G1StringDedupUnlinkOrOopsDoClosure(BoolObjectClosure* is_alive,
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
188 OopClosure* keep_alive,
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
189 bool allow_resize_and_rehash) :
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
190 _is_alive(is_alive),
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
191 _keep_alive(keep_alive),
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
192 _resized_table(NULL),
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
193 _rehashed_table(NULL),
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
194 _next_queue(0),
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
195 _next_bucket(0) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
196 if (allow_resize_and_rehash) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
197 // If both resize and rehash is needed, only do resize. Rehash of
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
198 // the table will eventually happen if the situation persists.
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
199 _resized_table = G1StringDedupTable::prepare_resize();
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
200 if (!is_resizing()) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
201 _rehashed_table = G1StringDedupTable::prepare_rehash();
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
202 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
203 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
204 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
205
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
206 G1StringDedupUnlinkOrOopsDoClosure::~G1StringDedupUnlinkOrOopsDoClosure() {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
207 assert(!is_resizing() || !is_rehashing(), "Can not both resize and rehash");
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
208 if (is_resizing()) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
209 G1StringDedupTable::finish_resize(_resized_table);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
210 } else if (is_rehashing()) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
211 G1StringDedupTable::finish_rehash(_rehashed_table);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
212 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents:
diff changeset
213 }