Mercurial > hg > graal-jvmci-8
comparison src/share/vm/memory/allocation.cpp @ 11095:cf9d71d3e474
8016903: Thread::_handle_area initial size too big
Summary: Changed initial size to Chunk::tiny_size (216 bytes)
Reviewed-by: coleenp, dholmes, sspitsyn
author | iklam |
---|---|
date | Mon, 08 Jul 2013 10:58:48 -0700 |
parents | 2b9380b0bf0b |
children | 9758d9f36299 bdd155477289 |
comparison
equal
deleted
inserted
replaced
11094:cc5b7915104e | 11095:cf9d71d3e474 |
---|---|
234 Chunk* _first; // first cached Chunk; its first word points to next chunk | 234 Chunk* _first; // first cached Chunk; its first word points to next chunk |
235 size_t _num_chunks; // number of unused chunks in pool | 235 size_t _num_chunks; // number of unused chunks in pool |
236 size_t _num_used; // number of chunks currently checked out | 236 size_t _num_used; // number of chunks currently checked out |
237 const size_t _size; // size of each chunk (must be uniform) | 237 const size_t _size; // size of each chunk (must be uniform) |
238 | 238 |
239 // Our three static pools | 239 // Our four static pools |
240 static ChunkPool* _large_pool; | 240 static ChunkPool* _large_pool; |
241 static ChunkPool* _medium_pool; | 241 static ChunkPool* _medium_pool; |
242 static ChunkPool* _small_pool; | 242 static ChunkPool* _small_pool; |
243 static ChunkPool* _tiny_pool; | |
243 | 244 |
244 // return first element or null | 245 // return first element or null |
245 void* get_first() { | 246 void* get_first() { |
246 Chunk* c = _first; | 247 Chunk* c = _first; |
247 if (_first) { | 248 if (_first) { |
317 | 318 |
318 // Accessors to preallocated pool's | 319 // Accessors to preallocated pool's |
319 static ChunkPool* large_pool() { assert(_large_pool != NULL, "must be initialized"); return _large_pool; } | 320 static ChunkPool* large_pool() { assert(_large_pool != NULL, "must be initialized"); return _large_pool; } |
320 static ChunkPool* medium_pool() { assert(_medium_pool != NULL, "must be initialized"); return _medium_pool; } | 321 static ChunkPool* medium_pool() { assert(_medium_pool != NULL, "must be initialized"); return _medium_pool; } |
321 static ChunkPool* small_pool() { assert(_small_pool != NULL, "must be initialized"); return _small_pool; } | 322 static ChunkPool* small_pool() { assert(_small_pool != NULL, "must be initialized"); return _small_pool; } |
323 static ChunkPool* tiny_pool() { assert(_tiny_pool != NULL, "must be initialized"); return _tiny_pool; } | |
322 | 324 |
323 static void initialize() { | 325 static void initialize() { |
324 _large_pool = new ChunkPool(Chunk::size + Chunk::aligned_overhead_size()); | 326 _large_pool = new ChunkPool(Chunk::size + Chunk::aligned_overhead_size()); |
325 _medium_pool = new ChunkPool(Chunk::medium_size + Chunk::aligned_overhead_size()); | 327 _medium_pool = new ChunkPool(Chunk::medium_size + Chunk::aligned_overhead_size()); |
326 _small_pool = new ChunkPool(Chunk::init_size + Chunk::aligned_overhead_size()); | 328 _small_pool = new ChunkPool(Chunk::init_size + Chunk::aligned_overhead_size()); |
329 _tiny_pool = new ChunkPool(Chunk::tiny_size + Chunk::aligned_overhead_size()); | |
327 } | 330 } |
328 | 331 |
329 static void clean() { | 332 static void clean() { |
330 enum { BlocksToKeep = 5 }; | 333 enum { BlocksToKeep = 5 }; |
334 _tiny_pool->free_all_but(BlocksToKeep); | |
331 _small_pool->free_all_but(BlocksToKeep); | 335 _small_pool->free_all_but(BlocksToKeep); |
332 _medium_pool->free_all_but(BlocksToKeep); | 336 _medium_pool->free_all_but(BlocksToKeep); |
333 _large_pool->free_all_but(BlocksToKeep); | 337 _large_pool->free_all_but(BlocksToKeep); |
334 } | 338 } |
335 }; | 339 }; |
336 | 340 |
337 ChunkPool* ChunkPool::_large_pool = NULL; | 341 ChunkPool* ChunkPool::_large_pool = NULL; |
338 ChunkPool* ChunkPool::_medium_pool = NULL; | 342 ChunkPool* ChunkPool::_medium_pool = NULL; |
339 ChunkPool* ChunkPool::_small_pool = NULL; | 343 ChunkPool* ChunkPool::_small_pool = NULL; |
344 ChunkPool* ChunkPool::_tiny_pool = NULL; | |
340 | 345 |
341 void chunkpool_init() { | 346 void chunkpool_init() { |
342 ChunkPool::initialize(); | 347 ChunkPool::initialize(); |
343 } | 348 } |
344 | 349 |
374 size_t bytes = ARENA_ALIGN(requested_size) + length; | 379 size_t bytes = ARENA_ALIGN(requested_size) + length; |
375 switch (length) { | 380 switch (length) { |
376 case Chunk::size: return ChunkPool::large_pool()->allocate(bytes, alloc_failmode); | 381 case Chunk::size: return ChunkPool::large_pool()->allocate(bytes, alloc_failmode); |
377 case Chunk::medium_size: return ChunkPool::medium_pool()->allocate(bytes, alloc_failmode); | 382 case Chunk::medium_size: return ChunkPool::medium_pool()->allocate(bytes, alloc_failmode); |
378 case Chunk::init_size: return ChunkPool::small_pool()->allocate(bytes, alloc_failmode); | 383 case Chunk::init_size: return ChunkPool::small_pool()->allocate(bytes, alloc_failmode); |
384 case Chunk::tiny_size: return ChunkPool::tiny_pool()->allocate(bytes, alloc_failmode); | |
379 default: { | 385 default: { |
380 void* p = os::malloc(bytes, mtChunk, CALLER_PC); | 386 void* p = os::malloc(bytes, mtChunk, CALLER_PC); |
381 if (p == NULL && alloc_failmode == AllocFailStrategy::EXIT_OOM) { | 387 if (p == NULL && alloc_failmode == AllocFailStrategy::EXIT_OOM) { |
382 vm_exit_out_of_memory(bytes, OOM_MALLOC_ERROR, "Chunk::new"); | 388 vm_exit_out_of_memory(bytes, OOM_MALLOC_ERROR, "Chunk::new"); |
383 } | 389 } |
390 Chunk* c = (Chunk*)p; | 396 Chunk* c = (Chunk*)p; |
391 switch (c->length()) { | 397 switch (c->length()) { |
392 case Chunk::size: ChunkPool::large_pool()->free(c); break; | 398 case Chunk::size: ChunkPool::large_pool()->free(c); break; |
393 case Chunk::medium_size: ChunkPool::medium_pool()->free(c); break; | 399 case Chunk::medium_size: ChunkPool::medium_pool()->free(c); break; |
394 case Chunk::init_size: ChunkPool::small_pool()->free(c); break; | 400 case Chunk::init_size: ChunkPool::small_pool()->free(c); break; |
401 case Chunk::tiny_size: ChunkPool::tiny_pool()->free(c); break; | |
395 default: os::free(c, mtChunk); | 402 default: os::free(c, mtChunk); |
396 } | 403 } |
397 } | 404 } |
398 | 405 |
399 Chunk::Chunk(size_t length) : _len(length) { | 406 Chunk::Chunk(size_t length) : _len(length) { |