src/share/vm/gc_implementation/g1/g1CardCounts.hpp

Mon, 19 Aug 2019 10:11:31 +0200

author
neugens
date
Mon, 19 Aug 2019 10:11:31 +0200
changeset 9861
a248d0be1309
parent 9327
f96fcd9e1e1b
child 9448
73d689add964
permissions
-rw-r--r--

8229401: Fix JFR code cache test failures
8223689: Add JFR Thread Sampling Support
8223690: Add JFR BiasedLock Event Support
8223691: Add JFR G1 Region Type Change Event Support
8223692: Add JFR G1 Heap Summary Event Support
Summary: Backport JFR from JDK11, additional fixes
Reviewed-by: neugens, apetushkov
Contributed-by: denghui.ddh@alibaba-inc.com

     1 /*
     2  * Copyright (c) 2013, 2014, 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  */
    25 #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_G1CARDCOUNTS_HPP
    26 #define SHARE_VM_GC_IMPLEMENTATION_G1_G1CARDCOUNTS_HPP
    28 #include "gc_implementation/g1/g1RegionToSpaceMapper.hpp"
    29 #include "memory/allocation.hpp"
    30 #include "runtime/virtualspace.hpp"
    31 #include "utilities/globalDefinitions.hpp"
    33 class CardTableModRefBS;
    34 class G1CardCounts;
    35 class G1CollectedHeap;
    36 class G1RegionToSpaceMapper;
    37 class HeapRegion;
    39 class G1CardCountsMappingChangedListener : public G1MappingChangedListener {
    40  private:
    41   G1CardCounts* _counts;
    42  public:
    43   void set_cardcounts(G1CardCounts* counts) { _counts = counts; }
    45   virtual void on_commit(uint start_idx, size_t num_regions, bool zero_filled);
    46 };
    48 // Table to track the number of times a card has been refined. Once
    49 // a card has been refined a certain number of times, it is
    50 // considered 'hot' and its refinement is delayed by inserting the
    51 // card into the hot card cache. The card will then be refined when
    52 // it is evicted from the hot card cache, or when the hot card cache
    53 // is 'drained' during the next evacuation pause.
    55 class G1CardCounts: public CHeapObj<mtGC> {
    56   G1CardCountsMappingChangedListener _listener;
    58   G1CollectedHeap* _g1h;
    60   // The table of counts
    61   jubyte* _card_counts;
    63   // Max capacity of the reserved space for the counts table
    64   size_t _reserved_max_card_num;
    66   // CardTable bottom.
    67   const jbyte* _ct_bot;
    69   // Barrier set
    70   CardTableModRefBS* _ct_bs;
    72   // Returns true if the card counts table has been reserved.
    73   bool has_reserved_count_table() { return _card_counts != NULL; }
    75   // Returns true if the card counts table has been reserved and committed.
    76   bool has_count_table() {
    77     return has_reserved_count_table();
    78   }
    80   size_t ptr_2_card_num(const jbyte* card_ptr) {
    81     assert(card_ptr >= _ct_bot,
    82            err_msg("Invalid card pointer: "
    83                    "card_ptr: " PTR_FORMAT ", "
    84                    "_ct_bot: " PTR_FORMAT,
    85                    p2i(card_ptr), p2i(_ct_bot)));
    86     size_t card_num = pointer_delta(card_ptr, _ct_bot, sizeof(jbyte));
    87     assert(card_num >= 0 && card_num < _reserved_max_card_num,
    88            err_msg("card pointer out of range: " PTR_FORMAT, p2i(card_ptr)));
    89     return card_num;
    90   }
    92   jbyte* card_num_2_ptr(size_t card_num) {
    93     assert(card_num >= 0 && card_num < _reserved_max_card_num,
    94            err_msg("card num out of range: " SIZE_FORMAT, card_num));
    95     return (jbyte*) (_ct_bot + card_num);
    96   }
    98   // Clear the counts table for the given (exclusive) index range.
    99   void clear_range(size_t from_card_num, size_t to_card_num);
   101  public:
   102   G1CardCounts(G1CollectedHeap* g1h);
   104   void initialize(G1RegionToSpaceMapper* mapper);
   106   // Increments the refinement count for the given card.
   107   // Returns the pre-increment count value.
   108   uint add_card_count(jbyte* card_ptr);
   110   // Returns true if the given count is high enough to be considered
   111   // 'hot'; false otherwise.
   112   bool is_hot(uint count);
   114   // Clears the card counts for the cards spanned by the region
   115   void clear_region(HeapRegion* hr);
   117   // Clears the card counts for the cards spanned by the MemRegion
   118   void clear_range(MemRegion mr);
   120   // Clear the entire card counts table during GC.
   121   void clear_all();
   122 };
   124 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_G1CARDCOUNTS_HPP

mercurial