提交 3915ea47 编写于 作者: K kvn

7008325: CodeCache exhausted on sparc starting from hs20b04

Summary: remove clear_scratch_buffer_blob and let init_scratch_buffer_blob free and allocate a new blob if required.
Reviewed-by: twisti
上级 23bb8041
...@@ -939,7 +939,9 @@ void CodeCache::print_bounds(outputStream* st) { ...@@ -939,7 +939,9 @@ void CodeCache::print_bounds(outputStream* st) {
_heap->high(), _heap->high(),
_heap->high_boundary()); _heap->high_boundary());
st->print_cr(" total_blobs=" UINT32_FORMAT " nmethods=" UINT32_FORMAT st->print_cr(" total_blobs=" UINT32_FORMAT " nmethods=" UINT32_FORMAT
" adapters=" UINT32_FORMAT " free_code_cache=" SIZE_FORMAT, " adapters=" UINT32_FORMAT " free_code_cache=" SIZE_FORMAT
" largest_free_block=" SIZE_FORMAT,
CodeCache::nof_blobs(), CodeCache::nof_nmethods(), CodeCache::nof_blobs(), CodeCache::nof_nmethods(),
CodeCache::nof_adapters(), CodeCache::unallocated_capacity()); CodeCache::nof_adapters(), CodeCache::unallocated_capacity(),
CodeCache::largest_free_block());
} }
...@@ -158,6 +158,7 @@ class CodeCache : AllStatic { ...@@ -158,6 +158,7 @@ class CodeCache : AllStatic {
static size_t capacity() { return _heap->capacity(); } static size_t capacity() { return _heap->capacity(); }
static size_t max_capacity() { return _heap->max_capacity(); } static size_t max_capacity() { return _heap->max_capacity(); }
static size_t unallocated_capacity() { return _heap->unallocated_capacity(); } static size_t unallocated_capacity() { return _heap->unallocated_capacity(); }
static size_t largest_free_block() { return _heap->largest_free_block(); }
static bool needs_flushing() { return unallocated_capacity() < CodeCacheFlushingMinimumFreeSpace; } static bool needs_flushing() { return unallocated_capacity() < CodeCacheFlushingMinimumFreeSpace; }
static bool needs_cache_clean() { return _needs_cache_clean; } static bool needs_cache_clean() { return _needs_cache_clean; }
......
...@@ -315,6 +315,15 @@ size_t CodeHeap::allocated_capacity() const { ...@@ -315,6 +315,15 @@ size_t CodeHeap::allocated_capacity() const {
return l; return l;
} }
size_t CodeHeap::largest_free_block() const {
size_t len = 0;
for (FreeBlock* b = _freelist; b != NULL; b = b->link()) {
if (b->length() > len)
len = b->length();
}
return size(len);
}
// Free list management // Free list management
FreeBlock *CodeHeap::following_block(FreeBlock *b) { FreeBlock *CodeHeap::following_block(FreeBlock *b) {
......
...@@ -161,6 +161,7 @@ class CodeHeap : public CHeapObj { ...@@ -161,6 +161,7 @@ class CodeHeap : public CHeapObj {
size_t max_capacity() const; size_t max_capacity() const;
size_t allocated_capacity() const; size_t allocated_capacity() const;
size_t unallocated_capacity() const { return max_capacity() - allocated_capacity(); } size_t unallocated_capacity() const { return max_capacity() - allocated_capacity(); }
size_t largest_free_block() const;
// Debugging // Debugging
void verify(); void verify();
......
...@@ -444,15 +444,24 @@ void Compile::print_compile_messages() { ...@@ -444,15 +444,24 @@ void Compile::print_compile_messages() {
} }
//-----------------------init_scratch_buffer_blob------------------------------
// Construct a temporary BufferBlob and cache it for this compile.
void Compile::init_scratch_buffer_blob(int const_size) { void Compile::init_scratch_buffer_blob(int const_size) {
if (scratch_buffer_blob() != NULL) return; // If there is already a scratch buffer blob allocated and the
// constant section is big enough, use it. Otherwise free the
// current and allocate a new one.
BufferBlob* blob = scratch_buffer_blob();
if ((blob != NULL) && (const_size <= _scratch_const_size)) {
// Use the current blob.
} else {
if (blob != NULL) {
BufferBlob::free(blob);
}
// Construct a temporary CodeBuffer to have it construct a BufferBlob
// Cache this BufferBlob for this compile.
ResourceMark rm; ResourceMark rm;
_scratch_const_size = const_size; _scratch_const_size = const_size;
int size = (MAX_inst_size + MAX_stubs_size + _scratch_const_size); int size = (MAX_inst_size + MAX_stubs_size + _scratch_const_size);
BufferBlob* blob = BufferBlob::create("Compile::scratch_buffer", size); blob = BufferBlob::create("Compile::scratch_buffer", size);
// Record the buffer blob for next time. // Record the buffer blob for next time.
set_scratch_buffer_blob(blob); set_scratch_buffer_blob(blob);
// Have we run out of code space? // Have we run out of code space?
...@@ -461,6 +470,7 @@ void Compile::init_scratch_buffer_blob(int const_size) { ...@@ -461,6 +470,7 @@ void Compile::init_scratch_buffer_blob(int const_size) {
record_failure("Not enough space for scratch buffer in CodeCache"); record_failure("Not enough space for scratch buffer in CodeCache");
return; return;
} }
}
// Initialize the relocation buffers // Initialize the relocation buffers
relocInfo* locs_buf = (relocInfo*) blob->content_end() - MAX_locs_size; relocInfo* locs_buf = (relocInfo*) blob->content_end() - MAX_locs_size;
...@@ -468,13 +478,6 @@ void Compile::init_scratch_buffer_blob(int const_size) { ...@@ -468,13 +478,6 @@ void Compile::init_scratch_buffer_blob(int const_size) {
} }
void Compile::clear_scratch_buffer_blob() {
assert(scratch_buffer_blob(), "no BufferBlob set");
set_scratch_buffer_blob(NULL);
set_scratch_locs_memory(NULL);
}
//-----------------------scratch_emit_size------------------------------------- //-----------------------scratch_emit_size-------------------------------------
// Helper function that computes size by emitting code // Helper function that computes size by emitting code
uint Compile::scratch_emit_size(const Node* n) { uint Compile::scratch_emit_size(const Node* n) {
......
...@@ -1746,9 +1746,6 @@ void Compile::ScheduleAndBundle() { ...@@ -1746,9 +1746,6 @@ void Compile::ScheduleAndBundle() {
// Walk backwards over each basic block, computing the needed alignment // Walk backwards over each basic block, computing the needed alignment
// Walk over all the basic blocks // Walk over all the basic blocks
scheduling.DoScheduling(); scheduling.DoScheduling();
// Clear the BufferBlob used for scheduling.
clear_scratch_buffer_blob();
} }
//------------------------------ComputeLocalLatenciesForward------------------- //------------------------------ComputeLocalLatenciesForward-------------------
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册