89 this->initialize_thread_local_storage(); |
89 this->initialize_thread_local_storage(); |
90 this->record_stack_base_and_size(); |
90 this->record_stack_base_and_size(); |
91 MemSnapshot* snapshot = MemTracker::get_snapshot(); |
91 MemSnapshot* snapshot = MemTracker::get_snapshot(); |
92 assert(snapshot != NULL, "Worker should not be started"); |
92 assert(snapshot != NULL, "Worker should not be started"); |
93 MemRecorder* rec; |
93 MemRecorder* rec; |
|
94 unsigned long processing_generation = 0; |
|
95 bool worker_idle = false; |
94 |
96 |
95 while (!MemTracker::shutdown_in_progress()) { |
97 while (!MemTracker::shutdown_in_progress()) { |
96 NOT_PRODUCT(_last_gen_in_use = generations_in_use();) |
98 NOT_PRODUCT(_last_gen_in_use = generations_in_use();) |
97 { |
99 { |
98 // take a recorder from earliest generation in buffer |
100 // take a recorder from earliest generation in buffer |
99 ThreadCritical tc; |
101 ThreadCritical tc; |
100 rec = _gen[_head].next_recorder(); |
102 rec = _gen[_head].next_recorder(); |
101 } |
103 } |
102 if (rec != NULL) { |
104 if (rec != NULL) { |
|
105 if (rec->get_generation() != processing_generation || worker_idle) { |
|
106 processing_generation = rec->get_generation(); |
|
107 worker_idle = false; |
|
108 MemTracker::set_current_processing_generation(processing_generation); |
|
109 } |
|
110 |
103 // merge the recorder into staging area |
111 // merge the recorder into staging area |
104 if (!snapshot->merge(rec)) { |
112 if (!snapshot->merge(rec)) { |
105 MemTracker::shutdown(MemTracker::NMT_out_of_memory); |
113 MemTracker::shutdown(MemTracker::NMT_out_of_memory); |
106 } else { |
114 } else { |
107 NOT_PRODUCT(_merge_count ++;) |
115 NOT_PRODUCT(_merge_count ++;) |
127 if (!snapshot->promote(number_of_classes)) { |
135 if (!snapshot->promote(number_of_classes)) { |
128 // failed to promote, means out of memory |
136 // failed to promote, means out of memory |
129 MemTracker::shutdown(MemTracker::NMT_out_of_memory); |
137 MemTracker::shutdown(MemTracker::NMT_out_of_memory); |
130 } |
138 } |
131 } else { |
139 } else { |
|
140 // worker thread is idle |
|
141 worker_idle = true; |
|
142 MemTracker::report_worker_idle(); |
132 snapshot->wait(1000); |
143 snapshot->wait(1000); |
133 ThreadCritical tc; |
144 ThreadCritical tc; |
134 // check if more data arrived |
145 // check if more data arrived |
135 if (!_gen[_head].has_more_recorder()) { |
146 if (!_gen[_head].has_more_recorder()) { |
136 _gen[_head].add_recorders(MemTracker::get_pending_recorders()); |
147 _gen[_head].add_recorders(MemTracker::get_pending_recorders()); |