8022968: Some codecache allocation failures don't result in invoking the sweeper
authorthartmann
Thu, 03 Jul 2014 08:46:44 +0200
changeset 25495 aeb87692dfd0
parent 25494 c18718ecf276
child 25496 a829ea1310b5
8022968: Some codecache allocation failures don't result in invoking the sweeper Summary: Add calls to CompileBroker::handle_full_code_cache() or fail gracefully whenever allocation in the code cache fails. Reviewed-by: iveresov, vlivanov
hotspot/src/share/vm/code/vtableStubs.cpp
hotspot/src/share/vm/interpreter/interpreterRuntime.cpp
hotspot/src/share/vm/opto/compile.cpp
hotspot/src/share/vm/opto/output.cpp
hotspot/src/share/vm/runtime/icache.cpp
--- a/hotspot/src/share/vm/code/vtableStubs.cpp	Wed Jul 02 22:54:18 2014 +0200
+++ b/hotspot/src/share/vm/code/vtableStubs.cpp	Thu Jul 03 08:46:44 2014 +0200
@@ -24,6 +24,7 @@
 
 #include "precompiled.hpp"
 #include "code/vtableStubs.hpp"
+#include "compiler/compileBroker.hpp"
 #include "compiler/disassembler.hpp"
 #include "memory/allocation.inline.hpp"
 #include "memory/resourceArea.hpp"
@@ -62,6 +63,7 @@
    // If changing the name, update the other file accordingly.
     BufferBlob* blob = BufferBlob::create("vtable chunks", bytes);
     if (blob == NULL) {
+      CompileBroker::handle_full_code_cache();
       return NULL;
     }
     _chunk = blob->content_begin();
--- a/hotspot/src/share/vm/interpreter/interpreterRuntime.cpp	Wed Jul 02 22:54:18 2014 +0200
+++ b/hotspot/src/share/vm/interpreter/interpreterRuntime.cpp	Thu Jul 03 08:46:44 2014 +0200
@@ -1093,6 +1093,7 @@
 address SignatureHandlerLibrary::set_handler_blob() {
   BufferBlob* handler_blob = BufferBlob::create("native signature handlers", blob_size);
   if (handler_blob == NULL) {
+    CompileBroker::handle_full_code_cache();
     return NULL;
   }
   address handler = handler_blob->code_begin();
--- a/hotspot/src/share/vm/opto/compile.cpp	Wed Jul 02 22:54:18 2014 +0200
+++ b/hotspot/src/share/vm/opto/compile.cpp	Thu Jul 03 08:46:44 2014 +0200
@@ -29,6 +29,7 @@
 #include "classfile/systemDictionary.hpp"
 #include "code/exceptionHandlerTable.hpp"
 #include "code/nmethod.hpp"
+#include "compiler/compileBroker.hpp"
 #include "compiler/compileLog.hpp"
 #include "compiler/disassembler.hpp"
 #include "compiler/oopMap.hpp"
@@ -555,6 +556,7 @@
     if (scratch_buffer_blob() == NULL) {
       // Let CompilerBroker disable further compilations.
       record_failure("Not enough space for scratch buffer in CodeCache");
+      CompileBroker::handle_full_code_cache();
       return;
     }
   }
--- a/hotspot/src/share/vm/opto/output.cpp	Wed Jul 02 22:54:18 2014 +0200
+++ b/hotspot/src/share/vm/opto/output.cpp	Thu Jul 03 08:46:44 2014 +0200
@@ -1163,6 +1163,7 @@
   // Have we run out of code space?
   if ((cb->blob() == NULL) || (!CompileBroker::should_compile_new_jobs())) {
     C->record_failure("CodeCache is full");
+    CompileBroker::handle_full_code_cache();
     return NULL;
   }
   // Configure the code buffer.
@@ -1487,6 +1488,7 @@
       cb->insts()->maybe_expand_to_ensure_remaining(MAX_inst_size);
       if ((cb->blob() == NULL) || (!CompileBroker::should_compile_new_jobs())) {
         C->record_failure("CodeCache is full");
+        CompileBroker::handle_full_code_cache();
         return;
       }
 
@@ -1643,6 +1645,7 @@
   // One last check for failed CodeBuffer::expand:
   if ((cb->blob() == NULL) || (!CompileBroker::should_compile_new_jobs())) {
     C->record_failure("CodeCache is full");
+    CompileBroker::handle_full_code_cache();
     return;
   }
 
--- a/hotspot/src/share/vm/runtime/icache.cpp	Wed Jul 02 22:54:18 2014 +0200
+++ b/hotspot/src/share/vm/runtime/icache.cpp	Thu Jul 03 08:46:44 2014 +0200
@@ -34,6 +34,9 @@
   ResourceMark rm;
 
   BufferBlob* b = BufferBlob::create("flush_icache_stub", ICache::stub_size);
+  if (b == NULL) {
+    vm_exit_out_of_memory(ICache::stub_size, OOM_MALLOC_ERROR, "CodeCache: no space for flush_icache_stub");
+  }
   CodeBuffer c(b);
 
   ICacheStubGenerator g(&c);