src/share/vm/services/memTrackWorker.cpp
Print this page
rev 3901 : JDK-8005012: Add WB APIs to better support NMT testing
Summary:
*** 82,91 ****
--- 82,93 ----
this->initialize_thread_local_storage();
this->record_stack_base_and_size();
MemSnapshot* snapshot = MemTracker::get_snapshot();
assert(snapshot != NULL, "Worker should not be started");
MemRecorder* rec;
+ unsigned long processing_generation = 0;
+ bool worker_idle = false;
while (!MemTracker::shutdown_in_progress()) {
NOT_PRODUCT(_last_gen_in_use = generations_in_use();)
{
// take a recorder from earliest generation in buffer
*** 96,105 ****
--- 98,113 ----
}
assert(count_recorder(_gen[_head]) <= MemRecorder::_instance_count,
"infinite loop after dequeue");
}
if (rec != NULL) {
+ if (rec->get_generation() != processing_generation || worker_idle) {
+ processing_generation = rec->get_generation();
+ worker_idle = false;
+ MemTracker::set_current_processing_generation(processing_generation);
+ }
+
// merge the recorder into staging area
if (!snapshot->merge(rec)) {
MemTracker::shutdown(MemTracker::NMT_out_of_memory);
} else {
NOT_PRODUCT(_merge_count ++;)
*** 121,130 ****
--- 129,141 ----
if (!snapshot->promote()) {
// failed to promote, means out of memory
MemTracker::shutdown(MemTracker::NMT_out_of_memory);
}
} else {
+ // worker thread is idle
+ worker_idle = true;
+ MemTracker::report_worker_idle();
snapshot->wait(1000);
ThreadCritical tc;
// check if more data arrived
if (_gen[_head] == NULL) {
_gen[_head] = MemTracker::get_pending_recorders();