src/share/vm/services/memTrackWorker.cpp

Print this page
rev 3901 : JDK-8005012: Add WB APIs to better support NMT testing
Summary:

@@ -82,10 +82,12 @@
   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,10 +98,16 @@
       }
       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,10 +129,13 @@
         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();