annotate src/share/vm/gc_implementation/g1/concurrentG1Refine.hpp @ 889:15c5903cf9e1

6865703: G1: Parallelize hot card cache cleanup Summary: Have the GC worker threads clear the hot card cache in parallel by having each worker thread claim a chunk of the card cache and process the cards in that chunk. The size of the chunks that each thread will claim is determined at VM initialization from the size of the card cache and the number of worker threads. Reviewed-by: jmasa, tonyp
author johnc
date Mon, 03 Aug 2009 12:59:30 -0700
parents 215f81b4d9b3
children 6cb8e9df7174
rev   line source
ysr@342 1 /*
xdono@579 2 * Copyright 2001-2009 Sun Microsystems, Inc. All Rights Reserved.
ysr@342 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
ysr@342 4 *
ysr@342 5 * This code is free software; you can redistribute it and/or modify it
ysr@342 6 * under the terms of the GNU General Public License version 2 only, as
ysr@342 7 * published by the Free Software Foundation.
ysr@342 8 *
ysr@342 9 * This code is distributed in the hope that it will be useful, but WITHOUT
ysr@342 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
ysr@342 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
ysr@342 12 * version 2 for more details (a copy is included in the LICENSE file that
ysr@342 13 * accompanied this code).
ysr@342 14 *
ysr@342 15 * You should have received a copy of the GNU General Public License version
ysr@342 16 * 2 along with this work; if not, write to the Free Software Foundation,
ysr@342 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
ysr@342 18 *
ysr@342 19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
ysr@342 20 * CA 95054 USA or visit www.sun.com if you need additional information or
ysr@342 21 * have any questions.
ysr@342 22 *
ysr@342 23 */
ysr@342 24
ysr@342 25 // Forward decl
ysr@342 26 class ConcurrentG1RefineThread;
ysr@342 27 class G1RemSet;
ysr@342 28
apetrusenko@549 29 class ConcurrentG1Refine: public CHeapObj {
iveresov@794 30 ConcurrentG1RefineThread** _threads;
iveresov@794 31 int _n_threads;
ysr@342 32 // The cache for card refinement.
ysr@342 33 bool _use_cache;
ysr@342 34 bool _def_use_cache;
ysr@342 35 size_t _n_periods;
ysr@342 36 size_t _total_cards;
ysr@342 37 size_t _total_travs;
ysr@342 38
johnc@889 39 unsigned char* _card_counts;
johnc@889 40 unsigned _n_card_counts;
johnc@889 41 const jbyte* _ct_bot;
johnc@889 42 unsigned* _cur_card_count_histo;
johnc@889 43 unsigned* _cum_card_count_histo;
johnc@889 44
johnc@889 45 jbyte** _hot_cache;
johnc@889 46 int _hot_cache_size;
johnc@889 47 int _n_hot;
johnc@889 48 int _hot_cache_idx;
johnc@889 49
johnc@889 50 int _hot_cache_par_chunk_size;
johnc@889 51 volatile int _hot_cache_par_claimed_idx;
ysr@342 52
ysr@342 53 // Returns the count of this card after incrementing it.
ysr@342 54 int add_card_count(jbyte* card_ptr);
ysr@342 55
ysr@342 56 void print_card_count_histo_range(unsigned* histo, int from, int to,
ysr@342 57 float& cum_card_pct,
ysr@342 58 float& cum_travs_pct);
ysr@342 59 public:
ysr@342 60 ConcurrentG1Refine();
ysr@342 61 ~ConcurrentG1Refine();
ysr@342 62
ysr@342 63 void init(); // Accomplish some initialization that has to wait.
iveresov@794 64 void stop();
ysr@342 65
iveresov@794 66 // Iterate over the conc refine threads
iveresov@794 67 void threads_do(ThreadClosure *tc);
ysr@342 68
ysr@342 69 // If this is the first entry for the slot, writes into the cache and
ysr@342 70 // returns NULL. If it causes an eviction, returns the evicted pointer.
ysr@342 71 // Otherwise, its a cache hit, and returns NULL.
ysr@342 72 jbyte* cache_insert(jbyte* card_ptr);
ysr@342 73
ysr@342 74 // Process the cached entries.
ysr@342 75 void clean_up_cache(int worker_i, G1RemSet* g1rs);
ysr@342 76
johnc@889 77 // Set up for parallel processing of the cards in the hot cache
johnc@889 78 void clear_hot_cache_claimed_index() {
johnc@889 79 _hot_cache_par_claimed_idx = 0;
johnc@889 80 }
johnc@889 81
ysr@342 82 // Discard entries in the hot cache.
ysr@342 83 void clear_hot_cache() {
ysr@342 84 _hot_cache_idx = 0; _n_hot = 0;
ysr@342 85 }
ysr@342 86
ysr@342 87 bool hot_cache_is_empty() { return _n_hot == 0; }
ysr@342 88
ysr@342 89 bool use_cache() { return _use_cache; }
ysr@342 90 void set_use_cache(bool b) {
ysr@342 91 if (b) _use_cache = _def_use_cache;
ysr@342 92 else _use_cache = false;
ysr@342 93 }
ysr@342 94
ysr@342 95 void clear_and_record_card_counts();
ysr@342 96 void print_final_card_counts();
iveresov@795 97
iveresov@795 98 static size_t thread_num();
ysr@342 99 };