1 /*
  2  * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved.
  3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  4  *
  5  * This code is free software; you can redistribute it and/or modify it
  6  * under the terms of the GNU General Public License version 2 only, as
  7  * published by the Free Software Foundation.
  8  *
  9  * This code is distributed in the hope that it will be useful, but WITHOUT
 10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 12  * version 2 for more details (a copy is included in the LICENSE file that
 13  * accompanied this code).
 14  *
 15  * You should have received a copy of the GNU General Public License version
 16  * 2 along with this work; if not, write to the Free Software Foundation,
 17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 18  *
 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 #ifndef SHARE_VM_GC_G1_G1CARDCOUNTS_HPP
 26 #define SHARE_VM_GC_G1_G1CARDCOUNTS_HPP
 27 
 28 #include "gc/g1/g1CardTable.hpp"
 29 #include "gc/g1/g1RegionToSpaceMapper.hpp"
 30 #include "memory/allocation.hpp"
 31 #include "memory/virtualspace.hpp"
 32 #include "utilities/globalDefinitions.hpp"
 33 
 34 class CardTableModRefBS;
 35 class G1CardCounts;
 36 class G1CollectedHeap;
 37 class G1RegionToSpaceMapper;
 38 class HeapRegion;
 39 
 40 class G1CardCountsMappingChangedListener : public G1MappingChangedListener {
 41  private:
 42   G1CardCounts* _counts;
 43  public:
 44   void set_cardcounts(G1CardCounts* counts) { _counts = counts; }
 45 
 46   virtual void on_commit(uint start_idx, size_t num_regions, bool zero_filled);
 47 };
 48 
 49 // Table to track the number of times a card has been refined. Once
 50 // a card has been refined a certain number of times, it is
 51 // considered 'hot' and its refinement is delayed by inserting the
 52 // card into the hot card cache. The card will then be refined when
 53 // it is evicted from the hot card cache, or when the hot card cache
 54 // is 'drained' during the next evacuation pause.
 55 
 56 class G1CardCounts: public CHeapObj<mtGC> {
 57   G1CardCountsMappingChangedListener _listener;
 58 
 59   G1CollectedHeap* _g1h;
 60   G1CardTable*     _ct;
 61 
 62   // The table of counts
 63   jubyte* _card_counts;
 64 
 65   // Max capacity of the reserved space for the counts table
 66   size_t _reserved_max_card_num;
 67 
 68   // CardTable bottom.
 69   const jbyte* _ct_bot;
 70 
 71   // Returns true if the card counts table has been reserved.
 72   bool has_reserved_count_table() { return _card_counts != NULL; }
 73 
 74   // Returns true if the card counts table has been reserved and committed.
 75   bool has_count_table() {
 76     return has_reserved_count_table();
 77   }
 78 
 79   size_t ptr_2_card_num(const jbyte* card_ptr) {
 80     assert(card_ptr >= _ct_bot,
 81            "Invalid card pointer: "
 82            "card_ptr: " PTR_FORMAT ", "
 83            "_ct_bot: " PTR_FORMAT,
 84            p2i(card_ptr), p2i(_ct_bot));
 85     size_t card_num = pointer_delta(card_ptr, _ct_bot, sizeof(jbyte));
 86     assert(card_num < _reserved_max_card_num,
 87            "card pointer out of range: " PTR_FORMAT, p2i(card_ptr));
 88     return card_num;
 89   }
 90 
 91   jbyte* card_num_2_ptr(size_t card_num) {
 92     assert(card_num < _reserved_max_card_num,
 93            "card num out of range: " SIZE_FORMAT, card_num);
 94     return (jbyte*) (_ct_bot + card_num);
 95   }
 96 
 97   // Clear the counts table for the given (exclusive) index range.
 98   void clear_range(size_t from_card_num, size_t to_card_num);
 99 
100  public:
101   G1CardCounts(G1CollectedHeap* g1h);
102 
103   // Return the number of slots needed for a card counts table
104   // that covers mem_region_words words.
105   static size_t compute_size(size_t mem_region_size_in_words);
106 
107   // Returns how many bytes of the heap a single byte of the card counts table
108   // corresponds to.
109   static size_t heap_map_factor();
110 
111   void initialize(G1RegionToSpaceMapper* mapper);
112 
113   // Increments the refinement count for the given card.
114   // Returns the pre-increment count value.
115   uint add_card_count(jbyte* card_ptr);
116 
117   // Returns true if the given count is high enough to be considered
118   // 'hot'; false otherwise.
119   bool is_hot(uint count);
120 
121   // Clears the card counts for the cards spanned by the region
122   void clear_region(HeapRegion* hr);
123 
124   // Clears the card counts for the cards spanned by the MemRegion
125   void clear_range(MemRegion mr);
126 
127   // Clear the entire card counts table during GC.
128   void clear_all();
129 };
130 
131 #endif // SHARE_VM_GC_G1_G1CARDCOUNTS_HPP