提交 5622f783 编写于 作者: I iklam

8016903: Thread::_handle_area initial size too big

Summary: Changed initial size to Chunk::tiny_size (216 bytes)
Reviewed-by: coleenp, dholmes, sspitsyn
上级 b7f6588d
...@@ -236,10 +236,11 @@ class ChunkPool: public CHeapObj<mtInternal> { ...@@ -236,10 +236,11 @@ class ChunkPool: public CHeapObj<mtInternal> {
size_t _num_used; // number of chunks currently checked out size_t _num_used; // number of chunks currently checked out
const size_t _size; // size of each chunk (must be uniform) const size_t _size; // size of each chunk (must be uniform)
// Our three static pools // Our four static pools
static ChunkPool* _large_pool; static ChunkPool* _large_pool;
static ChunkPool* _medium_pool; static ChunkPool* _medium_pool;
static ChunkPool* _small_pool; static ChunkPool* _small_pool;
static ChunkPool* _tiny_pool;
// return first element or null // return first element or null
void* get_first() { void* get_first() {
...@@ -319,15 +320,18 @@ class ChunkPool: public CHeapObj<mtInternal> { ...@@ -319,15 +320,18 @@ class ChunkPool: public CHeapObj<mtInternal> {
static ChunkPool* large_pool() { assert(_large_pool != NULL, "must be initialized"); return _large_pool; } static ChunkPool* large_pool() { assert(_large_pool != NULL, "must be initialized"); return _large_pool; }
static ChunkPool* medium_pool() { assert(_medium_pool != NULL, "must be initialized"); return _medium_pool; } static ChunkPool* medium_pool() { assert(_medium_pool != NULL, "must be initialized"); return _medium_pool; }
static ChunkPool* small_pool() { assert(_small_pool != NULL, "must be initialized"); return _small_pool; } static ChunkPool* small_pool() { assert(_small_pool != NULL, "must be initialized"); return _small_pool; }
static ChunkPool* tiny_pool() { assert(_tiny_pool != NULL, "must be initialized"); return _tiny_pool; }
static void initialize() { static void initialize() {
_large_pool = new ChunkPool(Chunk::size + Chunk::aligned_overhead_size()); _large_pool = new ChunkPool(Chunk::size + Chunk::aligned_overhead_size());
_medium_pool = new ChunkPool(Chunk::medium_size + Chunk::aligned_overhead_size()); _medium_pool = new ChunkPool(Chunk::medium_size + Chunk::aligned_overhead_size());
_small_pool = new ChunkPool(Chunk::init_size + Chunk::aligned_overhead_size()); _small_pool = new ChunkPool(Chunk::init_size + Chunk::aligned_overhead_size());
_tiny_pool = new ChunkPool(Chunk::tiny_size + Chunk::aligned_overhead_size());
} }
static void clean() { static void clean() {
enum { BlocksToKeep = 5 }; enum { BlocksToKeep = 5 };
_tiny_pool->free_all_but(BlocksToKeep);
_small_pool->free_all_but(BlocksToKeep); _small_pool->free_all_but(BlocksToKeep);
_medium_pool->free_all_but(BlocksToKeep); _medium_pool->free_all_but(BlocksToKeep);
_large_pool->free_all_but(BlocksToKeep); _large_pool->free_all_but(BlocksToKeep);
...@@ -337,6 +341,7 @@ class ChunkPool: public CHeapObj<mtInternal> { ...@@ -337,6 +341,7 @@ class ChunkPool: public CHeapObj<mtInternal> {
ChunkPool* ChunkPool::_large_pool = NULL; ChunkPool* ChunkPool::_large_pool = NULL;
ChunkPool* ChunkPool::_medium_pool = NULL; ChunkPool* ChunkPool::_medium_pool = NULL;
ChunkPool* ChunkPool::_small_pool = NULL; ChunkPool* ChunkPool::_small_pool = NULL;
ChunkPool* ChunkPool::_tiny_pool = NULL;
void chunkpool_init() { void chunkpool_init() {
ChunkPool::initialize(); ChunkPool::initialize();
...@@ -376,6 +381,7 @@ void* Chunk::operator new (size_t requested_size, AllocFailType alloc_failmode, ...@@ -376,6 +381,7 @@ void* Chunk::operator new (size_t requested_size, AllocFailType alloc_failmode,
case Chunk::size: return ChunkPool::large_pool()->allocate(bytes, alloc_failmode); case Chunk::size: return ChunkPool::large_pool()->allocate(bytes, alloc_failmode);
case Chunk::medium_size: return ChunkPool::medium_pool()->allocate(bytes, alloc_failmode); case Chunk::medium_size: return ChunkPool::medium_pool()->allocate(bytes, alloc_failmode);
case Chunk::init_size: return ChunkPool::small_pool()->allocate(bytes, alloc_failmode); case Chunk::init_size: return ChunkPool::small_pool()->allocate(bytes, alloc_failmode);
case Chunk::tiny_size: return ChunkPool::tiny_pool()->allocate(bytes, alloc_failmode);
default: { default: {
void* p = os::malloc(bytes, mtChunk, CALLER_PC); void* p = os::malloc(bytes, mtChunk, CALLER_PC);
if (p == NULL && alloc_failmode == AllocFailStrategy::EXIT_OOM) { if (p == NULL && alloc_failmode == AllocFailStrategy::EXIT_OOM) {
...@@ -392,6 +398,7 @@ void Chunk::operator delete(void* p) { ...@@ -392,6 +398,7 @@ void Chunk::operator delete(void* p) {
case Chunk::size: ChunkPool::large_pool()->free(c); break; case Chunk::size: ChunkPool::large_pool()->free(c); break;
case Chunk::medium_size: ChunkPool::medium_pool()->free(c); break; case Chunk::medium_size: ChunkPool::medium_pool()->free(c); break;
case Chunk::init_size: ChunkPool::small_pool()->free(c); break; case Chunk::init_size: ChunkPool::small_pool()->free(c); break;
case Chunk::tiny_size: ChunkPool::tiny_pool()->free(c); break;
default: os::free(c, mtChunk); default: os::free(c, mtChunk);
} }
} }
......
...@@ -353,7 +353,8 @@ class Chunk: CHeapObj<mtChunk> { ...@@ -353,7 +353,8 @@ class Chunk: CHeapObj<mtChunk> {
slack = 20, // suspected sizeof(Chunk) + internal malloc headers slack = 20, // suspected sizeof(Chunk) + internal malloc headers
#endif #endif
init_size = 1*K - slack, // Size of first chunk tiny_size = 256 - slack, // Size of first chunk (tiny)
init_size = 1*K - slack, // Size of first chunk (normal aka small)
medium_size= 10*K - slack, // Size of medium-sized chunk medium_size= 10*K - slack, // Size of medium-sized chunk
size = 32*K - slack, // Default size of an Arena chunk (following the first) size = 32*K - slack, // Default size of an Arena chunk (following the first)
non_pool_size = init_size + 32 // An initial size which is not one of above non_pool_size = init_size + 32 // An initial size which is not one of above
......
...@@ -227,7 +227,7 @@ class HandleArea: public Arena { ...@@ -227,7 +227,7 @@ class HandleArea: public Arena {
HandleArea* _prev; // link to outer (older) area HandleArea* _prev; // link to outer (older) area
public: public:
// Constructor // Constructor
HandleArea(HandleArea* prev) { HandleArea(HandleArea* prev) : Arena(Chunk::tiny_size) {
debug_only(_handle_mark_nesting = 0); debug_only(_handle_mark_nesting = 0);
debug_only(_no_handle_mark_nesting = 0); debug_only(_no_handle_mark_nesting = 0);
_prev = prev; _prev = prev;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册