comparison src/share/vm/gc_implementation/g1/g1StringDedup.cpp @ 22908:c3fcc09c9239

8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases Reviewed-by: tschatzl, mgerdin, ecaspole
author brutisso
date Thu, 26 Mar 2015 13:19:32 +0100
parents 1772223a25a2
children
comparison
equal deleted inserted replaced
22907:93a69595b807 22908:c3fcc09c9239
103 G1StringDedupTable::deduplicate(java_string, dummy); 103 G1StringDedupTable::deduplicate(java_string, dummy);
104 } 104 }
105 105
106 void G1StringDedup::oops_do(OopClosure* keep_alive) { 106 void G1StringDedup::oops_do(OopClosure* keep_alive) {
107 assert(is_enabled(), "String deduplication not enabled"); 107 assert(is_enabled(), "String deduplication not enabled");
108 unlink_or_oops_do(NULL, keep_alive); 108 unlink_or_oops_do(NULL, keep_alive, true /* allow_resize_and_rehash */);
109 } 109 }
110 110
111 void G1StringDedup::unlink(BoolObjectClosure* is_alive) { 111 void G1StringDedup::unlink(BoolObjectClosure* is_alive) {
112 assert(is_enabled(), "String deduplication not enabled"); 112 assert(is_enabled(), "String deduplication not enabled");
113 // Don't allow a potential resize or rehash during unlink, as the unlink 113 // Don't allow a potential resize or rehash during unlink, as the unlink
120 // and table. 120 // and table.
121 // 121 //
122 class G1StringDedupUnlinkOrOopsDoTask : public AbstractGangTask { 122 class G1StringDedupUnlinkOrOopsDoTask : public AbstractGangTask {
123 private: 123 private:
124 G1StringDedupUnlinkOrOopsDoClosure _cl; 124 G1StringDedupUnlinkOrOopsDoClosure _cl;
125 G1GCPhaseTimes* _phase_times;
125 126
126 public: 127 public:
127 G1StringDedupUnlinkOrOopsDoTask(BoolObjectClosure* is_alive, 128 G1StringDedupUnlinkOrOopsDoTask(BoolObjectClosure* is_alive,
128 OopClosure* keep_alive, 129 OopClosure* keep_alive,
129 bool allow_resize_and_rehash) : 130 bool allow_resize_and_rehash,
131 G1GCPhaseTimes* phase_times) :
130 AbstractGangTask("G1StringDedupUnlinkOrOopsDoTask"), 132 AbstractGangTask("G1StringDedupUnlinkOrOopsDoTask"),
131 _cl(is_alive, keep_alive, allow_resize_and_rehash) { 133 _cl(is_alive, keep_alive, allow_resize_and_rehash), _phase_times(phase_times) { }
132 }
133 134
134 virtual void work(uint worker_id) { 135 virtual void work(uint worker_id) {
135 double queue_fixup_start = os::elapsedTime(); 136 {
136 G1StringDedupQueue::unlink_or_oops_do(&_cl); 137 G1GCParPhaseTimesTracker x(_phase_times, G1GCPhaseTimes::StringDedupQueueFixup, worker_id);
137 138 G1StringDedupQueue::unlink_or_oops_do(&_cl);
138 double table_fixup_start = os::elapsedTime(); 139 }
139 G1StringDedupTable::unlink_or_oops_do(&_cl, worker_id); 140 {
140 141 G1GCParPhaseTimesTracker x(_phase_times, G1GCPhaseTimes::StringDedupTableFixup, worker_id);
141 double queue_fixup_time_ms = (table_fixup_start - queue_fixup_start) * 1000.0; 142 G1StringDedupTable::unlink_or_oops_do(&_cl, worker_id);
142 double table_fixup_time_ms = (os::elapsedTime() - table_fixup_start) * 1000.0; 143 }
143 G1CollectorPolicy* g1p = G1CollectedHeap::heap()->g1_policy();
144 g1p->phase_times()->record_string_dedup_queue_fixup_worker_time(worker_id, queue_fixup_time_ms);
145 g1p->phase_times()->record_string_dedup_table_fixup_worker_time(worker_id, table_fixup_time_ms);
146 } 144 }
147 }; 145 };
148 146
149 void G1StringDedup::unlink_or_oops_do(BoolObjectClosure* is_alive, OopClosure* keep_alive, bool allow_resize_and_rehash) { 147 void G1StringDedup::unlink_or_oops_do(BoolObjectClosure* is_alive,
150 assert(is_enabled(), "String deduplication not enabled"); 148 OopClosure* keep_alive,
151 G1CollectorPolicy* g1p = G1CollectedHeap::heap()->g1_policy(); 149 bool allow_resize_and_rehash,
152 g1p->phase_times()->note_string_dedup_fixup_start(); 150 G1GCPhaseTimes* phase_times) {
153 double fixup_start = os::elapsedTime(); 151 assert(is_enabled(), "String deduplication not enabled");
154 152
155 G1StringDedupUnlinkOrOopsDoTask task(is_alive, keep_alive, allow_resize_and_rehash); 153 G1StringDedupUnlinkOrOopsDoTask task(is_alive, keep_alive, allow_resize_and_rehash, phase_times);
156 if (G1CollectedHeap::use_parallel_gc_threads()) { 154 if (G1CollectedHeap::use_parallel_gc_threads()) {
157 G1CollectedHeap* g1h = G1CollectedHeap::heap(); 155 G1CollectedHeap* g1h = G1CollectedHeap::heap();
158 g1h->set_par_threads(); 156 g1h->set_par_threads();
159 g1h->workers()->run_task(&task); 157 g1h->workers()->run_task(&task);
160 g1h->set_par_threads(0); 158 g1h->set_par_threads(0);
161 } else { 159 } else {
162 task.work(0); 160 task.work(0);
163 } 161 }
164
165 double fixup_time_ms = (os::elapsedTime() - fixup_start) * 1000.0;
166 g1p->phase_times()->record_string_dedup_fixup_time(fixup_time_ms);
167 g1p->phase_times()->note_string_dedup_fixup_end();
168 } 162 }
169 163
170 void G1StringDedup::threads_do(ThreadClosure* tc) { 164 void G1StringDedup::threads_do(ThreadClosure* tc) {
171 assert(is_enabled(), "String deduplication not enabled"); 165 assert(is_enabled(), "String deduplication not enabled");
172 tc->do_thread(G1StringDedupThread::thread()); 166 tc->do_thread(G1StringDedupThread::thread());