Mercurial > hg > graal-compiler
comparison src/share/vm/gc_implementation/g1/g1StringDedupThread.cpp @ 17764:595c0f60d50d
8029075: String deduplication in G1
Summary: Implementation of JEP 192, http://openjdk.java.net/jeps/192
Reviewed-by: brutisso, tschatzl, coleenp
author | pliden |
---|---|
date | Tue, 18 Mar 2014 19:07:22 +0100 |
parents | |
children | 1772223a25a2 |
comparison
equal
deleted
inserted
replaced
17763:6e7e363c5a8f | 17764:595c0f60d50d |
---|---|
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(); | |
76 | |
77 // Include this thread in safepoints | |
78 stsJoin(); | |
79 | |
80 stat.mark_exec(); | |
81 | |
82 // Process the queue | |
83 for (;;) { | |
84 oop java_string = G1StringDedupQueue::pop(); | |
85 if (java_string == NULL) { | |
86 break; | |
87 } | |
88 | |
89 G1StringDedupTable::deduplicate(java_string, stat); | |
90 | |
91 // Safepoint this thread if needed | |
92 if (stsShouldYield()) { | |
93 stat.mark_block(); | |
94 stsYield(NULL); | |
95 stat.mark_unblock(); | |
96 } | |
97 } | |
98 | |
99 G1StringDedupTable::trim_entry_cache(); | |
100 | |
101 stat.mark_done(); | |
102 | |
103 // Print statistics | |
104 total_stat.add(stat); | |
105 print(gclog_or_tty, stat, total_stat); | |
106 | |
107 // Exclude this thread from safepoints | |
108 stsLeave(); | |
109 } | |
110 | |
111 ShouldNotReachHere(); | |
112 } | |
113 | |
114 void G1StringDedupThread::print(outputStream* st, const G1StringDedupStat& last_stat, const G1StringDedupStat& total_stat) { | |
115 if (G1Log::fine() || PrintStringDeduplicationStatistics) { | |
116 G1StringDedupStat::print_summary(st, last_stat, total_stat); | |
117 if (PrintStringDeduplicationStatistics) { | |
118 G1StringDedupStat::print_statistics(st, last_stat, false); | |
119 G1StringDedupStat::print_statistics(st, total_stat, true); | |
120 G1StringDedupTable::print_statistics(st); | |
121 G1StringDedupQueue::print_statistics(st); | |
122 } | |
123 } | |
124 } |