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) {