hotspot/src/share/vm/memory/allocation.cpp
changeset 6176 4d9030fe341f
parent 5547 f4b087cbb361
child 6184 a017b5ba6782
equal deleted inserted replaced
6175:86dbf3cacacc 6176:4d9030fe341f
   164   static void initialize() {
   164   static void initialize() {
   165     _large_pool  = new ChunkPool(Chunk::size        + Chunk::aligned_overhead_size());
   165     _large_pool  = new ChunkPool(Chunk::size        + Chunk::aligned_overhead_size());
   166     _medium_pool = new ChunkPool(Chunk::medium_size + Chunk::aligned_overhead_size());
   166     _medium_pool = new ChunkPool(Chunk::medium_size + Chunk::aligned_overhead_size());
   167     _small_pool  = new ChunkPool(Chunk::init_size   + Chunk::aligned_overhead_size());
   167     _small_pool  = new ChunkPool(Chunk::init_size   + Chunk::aligned_overhead_size());
   168   }
   168   }
       
   169 
       
   170   static void clean() {
       
   171     enum { BlocksToKeep = 5 };
       
   172      _small_pool->free_all_but(BlocksToKeep);
       
   173      _medium_pool->free_all_but(BlocksToKeep);
       
   174      _large_pool->free_all_but(BlocksToKeep);
       
   175   }
   169 };
   176 };
   170 
   177 
   171 ChunkPool* ChunkPool::_large_pool  = NULL;
   178 ChunkPool* ChunkPool::_large_pool  = NULL;
   172 ChunkPool* ChunkPool::_medium_pool = NULL;
   179 ChunkPool* ChunkPool::_medium_pool = NULL;
   173 ChunkPool* ChunkPool::_small_pool  = NULL;
   180 ChunkPool* ChunkPool::_small_pool  = NULL;
   174 
   181 
   175 
       
   176 void chunkpool_init() {
   182 void chunkpool_init() {
   177   ChunkPool::initialize();
   183   ChunkPool::initialize();
   178 }
   184 }
   179 
   185 
       
   186 void
       
   187 Chunk::clean_chunk_pool() {
       
   188   ChunkPool::clean();
       
   189 }
       
   190 
   180 
   191 
   181 //--------------------------------------------------------------------------------------
   192 //--------------------------------------------------------------------------------------
   182 // ChunkPoolCleaner implementation
   193 // ChunkPoolCleaner implementation
       
   194 //
   183 
   195 
   184 class ChunkPoolCleaner : public PeriodicTask {
   196 class ChunkPoolCleaner : public PeriodicTask {
   185   enum { CleaningInterval = 5000,        // cleaning interval in ms
   197   enum { CleaningInterval = 5000 };      // cleaning interval in ms
   186          BlocksToKeep     = 5            // # of extra blocks to keep
       
   187   };
       
   188 
   198 
   189  public:
   199  public:
   190    ChunkPoolCleaner() : PeriodicTask(CleaningInterval) {}
   200    ChunkPoolCleaner() : PeriodicTask(CleaningInterval) {}
   191    void task() {
   201    void task() {
   192      ChunkPool::small_pool()->free_all_but(BlocksToKeep);
   202      ChunkPool::clean();
   193      ChunkPool::medium_pool()->free_all_but(BlocksToKeep);
       
   194      ChunkPool::large_pool()->free_all_but(BlocksToKeep);
       
   195    }
   203    }
   196 };
   204 };
   197 
   205 
   198 //--------------------------------------------------------------------------------------
   206 //--------------------------------------------------------------------------------------
   199 // Chunk implementation
   207 // Chunk implementation