8014430: JRE crashes instead of stop compilation on full Code Cache. Internal Error (c1_Compiler.cpp:87)
Summary: Disable client compiler and switch to interpreter if there is not enough free space in the code cache.
Reviewed-by: kvn, twisti
--- a/hotspot/src/share/vm/c1/c1_Compiler.cpp Wed May 22 18:25:43 2013 -0700
+++ b/hotspot/src/share/vm/c1/c1_Compiler.cpp Thu May 23 14:11:09 2013 +0200
@@ -77,30 +77,42 @@
}
-BufferBlob* Compiler::build_buffer_blob() {
+BufferBlob* Compiler::get_buffer_blob(ciEnv* env) {
+ // Allocate buffer blob once at startup since allocation for each
+ // compilation seems to be too expensive (at least on Intel win32).
+ BufferBlob* buffer_blob = CompilerThread::current()->get_buffer_blob();
+ if (buffer_blob != NULL) {
+ return buffer_blob;
+ }
+
// setup CodeBuffer. Preallocate a BufferBlob of size
// NMethodSizeLimit plus some extra space for constants.
int code_buffer_size = Compilation::desired_max_code_buffer_size() +
Compilation::desired_max_constant_size();
- BufferBlob* blob = BufferBlob::create("Compiler1 temporary CodeBuffer",
- code_buffer_size);
- guarantee(blob != NULL, "must create initial code buffer");
- return blob;
+
+ buffer_blob = BufferBlob::create("Compiler1 temporary CodeBuffer",
+ code_buffer_size);
+ if (buffer_blob == NULL) {
+ CompileBroker::handle_full_code_cache();
+ env->record_failure("CodeCache is full");
+ } else {
+ CompilerThread::current()->set_buffer_blob(buffer_blob);
+ }
+
+ return buffer_blob;
}
void Compiler::compile_method(ciEnv* env, ciMethod* method, int entry_bci) {
- // Allocate buffer blob once at startup since allocation for each
- // compilation seems to be too expensive (at least on Intel win32).
- BufferBlob* buffer_blob = CompilerThread::current()->get_buffer_blob();
+ BufferBlob* buffer_blob = Compiler::get_buffer_blob(env);
if (buffer_blob == NULL) {
- buffer_blob = build_buffer_blob();
- CompilerThread::current()->set_buffer_blob(buffer_blob);
+ return;
}
if (!is_initialized()) {
initialize();
}
+
// invoke compilation
{
// We are nested here because we need for the destructor
--- a/hotspot/src/share/vm/c1/c1_Compiler.hpp Wed May 22 18:25:43 2013 -0700
+++ b/hotspot/src/share/vm/c1/c1_Compiler.hpp Thu May 23 14:11:09 2013 +0200
@@ -46,7 +46,7 @@
virtual bool is_c1() { return true; };
- BufferBlob* build_buffer_blob();
+ BufferBlob* get_buffer_blob(ciEnv* env);
// Missing feature tests
virtual bool supports_native() { return true; }