< prev index next >

src/hotspot/share/memory/heapInspection.cpp

Print this page

        

@@ -538,10 +538,18 @@
   bool should_visit(oop obj) {
     return _filter == NULL || _filter->do_object_b(obj);
   }
 };
 
+// Heap inspection for every worker.
+// When native OOM hanppens for KlassInfoTable, set _success to false.
+// TODO(?) it seems atomically set/get _success is unnecessary becasue it
+// is set to true at constructor and can only be set to false here.
+// the only risk seems a worker may continue inspect heap when another
+// worker set _success to false, but this is OK because the current worker
+// doesn't change _success if everything is OK for it's inpection work, and
+// the _success will be false finally and serial heap inpection can be tried.
 void ParHeapInspectTask::work(uint worker_id) {
   size_t missed_count = 0;
   if (!_success) {
     // other worker has failed on parallel iteration.
     return;

@@ -575,13 +583,16 @@
   if (parallel_thread_num > 1) {
     ParallelObjectIterator* poi = Universe::heap()->parallel_object_iterator(parallel_thread_num);
     if (poi != NULL) {
       ParHeapInspectTask task(poi, cit, filter);
       Universe::heap()->run_task(&task);
+      delete poi;
+      if (task.success()) {
       return task.missed_count();
     }
   }
+  }
 
   // If no parallel iteration available, run serially.
   RecordInstanceClosure ric(cit, filter);
   Universe::heap()->object_iterate(&ric);
   return ric.missed_count();
< prev index next >