Mercurial > hg > graal-compiler
annotate src/share/vm/gc_implementation/g1/g1StringDedupThread.cpp @ 20292:5d7a63aee595
8049051: Use of during_initial_mark_pause() in G1CollectorPolicy::record_collection_pause_end() prevents use of seperate object copy time prediction during marking
Summary: Replaced use of during_initial_mark_pause() with the variable last_pause_included_initial_mark that holds the real old value of _during_initial_mark_pause.
Reviewed-by: brutisso, ehelin
author | tschatzl |
---|---|
date | Mon, 21 Jul 2014 09:59:37 +0200 |
parents | 581e70386ec9 |
children |
rev | line source |
---|---|
17764 | 1 /* |
2 * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. | |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
20 * or visit www.oracle.com if you need additional information or have any | |
21 * questions. | |
22 * | |
23 */ | |
24 | |
25 #include "precompiled.hpp" | |
26 #include "gc_implementation/g1/g1Log.hpp" | |
27 #include "gc_implementation/g1/g1StringDedup.hpp" | |
28 #include "gc_implementation/g1/g1StringDedupTable.hpp" | |
29 #include "gc_implementation/g1/g1StringDedupThread.hpp" | |
30 #include "gc_implementation/g1/g1StringDedupQueue.hpp" | |
31 | |
32 G1StringDedupThread* G1StringDedupThread::_thread = NULL; | |
33 | |
34 G1StringDedupThread::G1StringDedupThread() : | |
35 ConcurrentGCThread() { | |
36 set_name("String Deduplication Thread"); | |
37 create_and_start(); | |
38 } | |
39 | |
40 G1StringDedupThread::~G1StringDedupThread() { | |
41 ShouldNotReachHere(); | |
42 } | |
43 | |
44 void G1StringDedupThread::create() { | |
45 assert(G1StringDedup::is_enabled(), "String deduplication not enabled"); | |
46 assert(_thread == NULL, "One string deduplication thread allowed"); | |
47 _thread = new G1StringDedupThread(); | |
48 } | |
49 | |
50 G1StringDedupThread* G1StringDedupThread::thread() { | |
51 assert(G1StringDedup::is_enabled(), "String deduplication not enabled"); | |
52 assert(_thread != NULL, "String deduplication thread not created"); | |
53 return _thread; | |
54 } | |
55 | |
56 void G1StringDedupThread::print_on(outputStream* st) const { | |
57 st->print("\"%s\" ", name()); | |
58 Thread::print_on(st); | |
59 st->cr(); | |
60 } | |
61 | |
62 void G1StringDedupThread::run() { | |
63 G1StringDedupStat total_stat; | |
64 | |
65 initialize_in_thread(); | |
66 wait_for_universe_init(); | |
67 | |
68 // Main loop | |
69 for (;;) { | |
70 G1StringDedupStat stat; | |
71 | |
72 stat.mark_idle(); | |
73 | |
74 // Wait for the queue to become non-empty | |
75 G1StringDedupQueue::wait(); | |
17947
1772223a25a2
8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents:
17764
diff
changeset
|
76 if (_should_terminate) { |
1772223a25a2
8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents:
17764
diff
changeset
|
77 break; |
1772223a25a2
8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents:
17764
diff
changeset
|
78 } |
17764 | 79 |
20192 | 80 { |
81 // Include thread in safepoints | |
82 SuspendibleThreadSetJoiner sts; | |
17764 | 83 |
20192 | 84 stat.mark_exec(); |
17764 | 85 |
20192 | 86 // Process the queue |
87 for (;;) { | |
88 oop java_string = G1StringDedupQueue::pop(); | |
89 if (java_string == NULL) { | |
90 break; | |
91 } | |
92 | |
93 G1StringDedupTable::deduplicate(java_string, stat); | |
94 | |
95 // Safepoint this thread if needed | |
96 if (sts.should_yield()) { | |
97 stat.mark_block(); | |
98 sts.yield(); | |
99 stat.mark_unblock(); | |
100 } | |
17764 | 101 } |
102 | |
20192 | 103 G1StringDedupTable::trim_entry_cache(); |
17764 | 104 |
20192 | 105 stat.mark_done(); |
17764 | 106 |
20192 | 107 // Print statistics |
108 total_stat.add(stat); | |
109 print(gclog_or_tty, stat, total_stat); | |
110 } | |
17764 | 111 } |
112 | |
17947
1772223a25a2
8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents:
17764
diff
changeset
|
113 terminate(); |
1772223a25a2
8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents:
17764
diff
changeset
|
114 } |
1772223a25a2
8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents:
17764
diff
changeset
|
115 |
1772223a25a2
8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents:
17764
diff
changeset
|
116 void G1StringDedupThread::stop() { |
1772223a25a2
8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents:
17764
diff
changeset
|
117 { |
1772223a25a2
8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents:
17764
diff
changeset
|
118 MonitorLockerEx ml(Terminator_lock); |
1772223a25a2
8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents:
17764
diff
changeset
|
119 _thread->_should_terminate = true; |
1772223a25a2
8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents:
17764
diff
changeset
|
120 } |
1772223a25a2
8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents:
17764
diff
changeset
|
121 |
1772223a25a2
8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents:
17764
diff
changeset
|
122 G1StringDedupQueue::cancel_wait(); |
1772223a25a2
8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents:
17764
diff
changeset
|
123 |
1772223a25a2
8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents:
17764
diff
changeset
|
124 { |
1772223a25a2
8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents:
17764
diff
changeset
|
125 MonitorLockerEx ml(Terminator_lock); |
1772223a25a2
8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents:
17764
diff
changeset
|
126 while (!_thread->_has_terminated) { |
1772223a25a2
8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents:
17764
diff
changeset
|
127 ml.wait(); |
1772223a25a2
8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents:
17764
diff
changeset
|
128 } |
1772223a25a2
8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents:
17764
diff
changeset
|
129 } |
17764 | 130 } |
131 | |
132 void G1StringDedupThread::print(outputStream* st, const G1StringDedupStat& last_stat, const G1StringDedupStat& total_stat) { | |
133 if (G1Log::fine() || PrintStringDeduplicationStatistics) { | |
134 G1StringDedupStat::print_summary(st, last_stat, total_stat); | |
135 if (PrintStringDeduplicationStatistics) { | |
136 G1StringDedupStat::print_statistics(st, last_stat, false); | |
137 G1StringDedupStat::print_statistics(st, total_stat, true); | |
138 G1StringDedupTable::print_statistics(st); | |
139 G1StringDedupQueue::print_statistics(st); | |
140 } | |
141 } | |
142 } |