< 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 >