--- old/src/share/vm/gc/shared/workerManager.hpp 2016-06-23 12:29:40.991519647 -0700 +++ new/src/share/vm/gc/shared/workerManager.hpp 2016-06-23 12:29:40.883519650 -0700 @@ -55,9 +55,17 @@ uint start = created_workers; uint end = MIN2(active_workers, total_workers); for (uint worker_id = start; worker_id < end; worker_id += 1) { - WorkerThread* new_worker = holder->install_worker(worker_id); - assert(new_worker != NULL, "Failed to allocate GangWorker"); + WorkerThread* new_worker = NULL; + if (initializing || !InjectGCWorkerCreationFailure) { + new_worker = holder->install_worker(worker_id); + } if (new_worker == NULL || !os::create_thread(new_worker, worker_type)) { + log_trace(gc, task)("WorkerManager::add_workers() : " + "creation failed due to failed allocation of native %s", + new_worker == NULL ? "memory" : "thread"); + if (new_worker != NULL) { + delete new_worker; + } if (initializing) { vm_exit_out_of_memory(0, OOM_MALLOC_ERROR, "Cannot create worker GC thread. Out of system resources."); } @@ -67,9 +75,8 @@ os::start_thread(new_worker); } - log_trace(gc, task)("AdaptiveSizePolicy::add_workers() : " - "active_workers: %u created_workers: %u", - active_workers, created_workers); + log_trace(gc, task)("WorkerManager::add_workers() : " + "created_workers: %u", created_workers); return created_workers; } --- old/src/share/vm/runtime/globals.hpp 2016-06-23 12:29:41.627519625 -0700 +++ new/src/share/vm/runtime/globals.hpp 2016-06-23 12:29:41.499519629 -0700 @@ -1539,6 +1539,10 @@ "Dynamically choose the number of parallel threads " \ "parallel gc will use") \ \ + diagnostic(bool, InjectGCWorkerCreationFailure, false, \ + "Inject thread creation failures for " \ + "UseDynamicNumberOfGCThreads") \ + \ diagnostic(bool, ForceDynamicNumberOfGCThreads, false, \ "Force dynamic selection of the number of " \ "parallel threads parallel gc will use to aid debugging") \