--- old/src/share/vm/code/nmethod.cpp 2013-10-09 15:17:14.900404557 +0200 +++ new/src/share/vm/code/nmethod.cpp 2013-10-09 15:17:14.392404576 +0200 @@ -505,7 +505,7 @@ CodeOffsets offsets; offsets.set_value(CodeOffsets::Verified_Entry, vep_offset); offsets.set_value(CodeOffsets::Frame_Complete, frame_complete); - nm = new (native_nmethod_size) nmethod(method(), native_nmethod_size, + nm = new (native_nmethod_size, CompLevel_none) nmethod(method(), native_nmethod_size, compile_id, &offsets, code_buffer, frame_size, basic_lock_owner_sp_offset, @@ -543,7 +543,7 @@ offsets.set_value(CodeOffsets::Dtrace_trap, trap_offset); offsets.set_value(CodeOffsets::Frame_Complete, frame_complete); - nm = new (nmethod_size) nmethod(method(), nmethod_size, + nm = new (nmethod_size, CompLevel_none) nmethod(method(), nmethod_size, &offsets, code_buffer, frame_size); NOT_PRODUCT(if (nm != NULL) nmethod_stats.note_nmethod(nm)); @@ -591,7 +591,7 @@ + round_to(nul_chk_table->size_in_bytes(), oopSize) + round_to(debug_info->data_size() , oopSize); - nm = new (nmethod_size) + nm = new (nmethod_size, comp_level) nmethod(method(), nmethod_size, compile_id, entry_bci, offsets, orig_pc_offset, debug_info, dependencies, code_buffer, frame_size, oop_maps, @@ -803,9 +803,10 @@ } #endif // def HAVE_DTRACE_H -void* nmethod::operator new(size_t size, int nmethod_size) throw() { - // Not critical, may return null if there is too little continuous memory - return CodeCache::allocate(nmethod_size); +void* nmethod::operator new(size_t size, int nmethod_size, int comp_level) throw () { + // Nmethods are allocated on separate heaps and therefore do not share memory with critical CodeBlobs. + // We nevertheless define the allocation as critical to make sure all heap memory is used. + return CodeCache::allocate(nmethod_size, CodeCache::get_code_blob_type(comp_level), true); } nmethod::nmethod( @@ -1438,7 +1439,7 @@ Events::log(JavaThread::current(), "flushing nmethod " INTPTR_FORMAT, this); if (PrintMethodFlushing) { tty->print_cr("*flushing nmethod %3d/" INTPTR_FORMAT ". Live blobs:" UINT32_FORMAT "/Free CodeCache:" SIZE_FORMAT "Kb", - _compile_id, this, CodeCache::nof_blobs(), CodeCache::unallocated_capacity()/1024); + _compile_id, this, CodeCache::nof_blobs(), CodeCache::unallocated_capacity(CodeCache::get_code_blob_type(_comp_level))/1024); } // We need to deallocate any ExceptionCache data. @@ -1462,10 +1463,9 @@ ((CodeBlob*)(this))->flush(); - CodeCache::free(this); + CodeCache::free(this, CodeCache::get_code_blob_type(_comp_level)); } - // // Notify all classes this nmethod is dependent on that it is no // longer dependent. This should only be called in two situations. @@ -2366,7 +2366,7 @@ ResourceMark rm; - if (!CodeCache::contains(this)) { + if (!CodeCache::contains_nmethod(this)) { fatal(err_msg("nmethod at " INTPTR_FORMAT " not in zone", this)); }