< prev index next >

src/hotspot/share/gc/shenandoah/shenandoahHeap.inline.hpp

Print this page
rev 47365 : [mq]: oomalot.patch

@@ -318,23 +318,33 @@
   size_t size_with_fwdptr = size_no_fwdptr + BrooksPointer::word_size();
 
   assert(!heap_region_containing(p)->is_humongous(), "never evacuate humongous objects");
 
   bool alloc_from_gclab = true;
-  HeapWord* filler = allocate_from_gclab(thread, size_with_fwdptr);
-  if (filler == NULL) {
-    filler = allocate_memory(size_with_fwdptr, _alloc_shared_gc);
-    alloc_from_gclab = false;
-  }
-
+  HeapWord* filler;
 #ifdef ASSERT
   // Checking that current Java thread does not hold Threads_lock when we get here.
   // If that ever be the case, we'd deadlock in oom_during_evacuation.
   if ((! Thread::current()->is_GC_task_thread()) && (! Thread::current()->is_ConcurrentGC_thread())) {
     assert(! Threads_lock->owned_by_self()
            || SafepointSynchronize::is_at_safepoint(), "must not hold Threads_lock here");
   }
+
+  if (ShenandoahOOMDuringEvacALot &&
+      (! Thread::current()->is_GC_task_thread()) &&
+      (! Thread::current()->is_ConcurrentGC_thread()) &&
+      (os::random() & 1) == 0) { // Simulate OOM every ~2nd slow-path call
+        filler = NULL;
+  } else {
+#endif
+    filler = allocate_from_gclab(thread, size_with_fwdptr);
+    if (filler == NULL) {
+      filler = allocate_memory(size_with_fwdptr, _alloc_shared_gc);
+      alloc_from_gclab = false;
+    }
+#ifdef ASSERT
+  }
 #endif
 
   if (filler == NULL) {
     oom_during_evacuation();
     // If this is a Java thread, it should have waited
< prev index next >