# HG changeset patch # User thartmann # Date 1404370004 -7200 # Node ID aeb87692dfd022e6cc5920b0a27ef552fb654c2c # Parent c18718ecf276ed320e9b829dfad08c3413599d29 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 diff -r c18718ecf276 -r aeb87692dfd0 hotspot/src/share/vm/code/vtableStubs.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(); diff -r c18718ecf276 -r aeb87692dfd0 hotspot/src/share/vm/interpreter/interpreterRuntime.cpp --- 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(); diff -r c18718ecf276 -r aeb87692dfd0 hotspot/src/share/vm/opto/compile.cpp --- 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; } } diff -r c18718ecf276 -r aeb87692dfd0 hotspot/src/share/vm/opto/output.cpp --- 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; } diff -r c18718ecf276 -r aeb87692dfd0 hotspot/src/share/vm/runtime/icache.cpp --- 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);