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();