< prev index next >

src/share/vm/gc/g1/g1HotCardCache.cpp

Print this page
rev 10387 : 8151436: Leaner ArrayAllocator and BitMaps
Reviewed-by: tschatzl, pliden, kbarrett


  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 #include "precompiled.hpp"
  26 #include "gc/g1/dirtyCardQueue.hpp"
  27 #include "gc/g1/g1CollectedHeap.inline.hpp"
  28 #include "gc/g1/g1HotCardCache.hpp"
  29 #include "runtime/atomic.inline.hpp"
  30 
  31 G1HotCardCache::G1HotCardCache(G1CollectedHeap *g1h):
  32   _g1h(g1h), _hot_cache(NULL), _use_cache(false), _card_counts(g1h) {}
  33 
  34 void G1HotCardCache::initialize(G1RegionToSpaceMapper* card_counts_storage) {
  35   if (default_use_cache()) {
  36     _use_cache = true;
  37 
  38     _hot_cache_size = (size_t)1 << G1ConcRSLogCacheSize;
  39     _hot_cache = _hot_cache_memory.allocate(_hot_cache_size);
  40 
  41     reset_hot_cache_internal();
  42 
  43     // For refining the cards in the hot cache in parallel
  44     _hot_cache_par_chunk_size = ClaimChunkSize;
  45     _hot_cache_par_claimed_idx = 0;
  46 
  47     _card_counts.initialize(card_counts_storage);
  48   }
  49 }
  50 
  51 G1HotCardCache::~G1HotCardCache() {
  52   if (default_use_cache()) {
  53     assert(_hot_cache != NULL, "Logic");
  54     _hot_cache_memory.free();
  55     _hot_cache = NULL;
  56   }
  57 }
  58 
  59 jbyte* G1HotCardCache::insert(jbyte* card_ptr) {
  60   uint count = _card_counts.add_card_count(card_ptr);
  61   if (!_card_counts.is_hot(count)) {
  62     // The card is not hot so do not store it in the cache;
  63     // return it for immediate refining.
  64     return card_ptr;
  65   }
  66   // Otherwise, the card is hot.
  67   size_t index = Atomic::add(1, &_hot_cache_idx) - 1;
  68   size_t masked_index = index & (_hot_cache_size - 1);
  69   jbyte* current_ptr = _hot_cache[masked_index];
  70 
  71   // Try to store the new card pointer into the cache. Compare-and-swap to guard
  72   // against the unlikely event of a race resulting in another card pointer to
  73   // have already been written to the cache. In this case we will return
  74   // card_ptr in favor of the other option, which would be starting over. This




  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 #include "precompiled.hpp"
  26 #include "gc/g1/dirtyCardQueue.hpp"
  27 #include "gc/g1/g1CollectedHeap.inline.hpp"
  28 #include "gc/g1/g1HotCardCache.hpp"
  29 #include "runtime/atomic.inline.hpp"
  30 
  31 G1HotCardCache::G1HotCardCache(G1CollectedHeap *g1h):
  32   _g1h(g1h), _hot_cache(NULL), _use_cache(false), _card_counts(g1h) {}
  33 
  34 void G1HotCardCache::initialize(G1RegionToSpaceMapper* card_counts_storage) {
  35   if (default_use_cache()) {
  36     _use_cache = true;
  37 
  38     _hot_cache_size = (size_t)1 << G1ConcRSLogCacheSize;
  39     _hot_cache = ArrayAllocator<jbyte*, mtGC>::allocate(_hot_cache_size);
  40 
  41     reset_hot_cache_internal();
  42 
  43     // For refining the cards in the hot cache in parallel
  44     _hot_cache_par_chunk_size = ClaimChunkSize;
  45     _hot_cache_par_claimed_idx = 0;
  46 
  47     _card_counts.initialize(card_counts_storage);
  48   }
  49 }
  50 
  51 G1HotCardCache::~G1HotCardCache() {
  52   if (default_use_cache()) {
  53     assert(_hot_cache != NULL, "Logic");
  54     ArrayAllocator<jbyte*, mtGC>::free(_hot_cache, _hot_cache_size);
  55     _hot_cache = NULL;
  56   }
  57 }
  58 
  59 jbyte* G1HotCardCache::insert(jbyte* card_ptr) {
  60   uint count = _card_counts.add_card_count(card_ptr);
  61   if (!_card_counts.is_hot(count)) {
  62     // The card is not hot so do not store it in the cache;
  63     // return it for immediate refining.
  64     return card_ptr;
  65   }
  66   // Otherwise, the card is hot.
  67   size_t index = Atomic::add(1, &_hot_cache_idx) - 1;
  68   size_t masked_index = index & (_hot_cache_size - 1);
  69   jbyte* current_ptr = _hot_cache[masked_index];
  70 
  71   // Try to store the new card pointer into the cache. Compare-and-swap to guard
  72   // against the unlikely event of a race resulting in another card pointer to
  73   // have already been written to the cache. In this case we will return
  74   // card_ptr in favor of the other option, which would be starting over. This


< prev index next >