src/hotspot/share/gc/g1/g1HeapVerifier.hpp
changeset 47216 71c04702a3d5
parent 46810 7dad333205cd
child 47885 5caa1d5f74c1
equal deleted inserted replaced
47215:4ebc2e2fb97c 47216:71c04702a3d5
       
     1 /*
       
     2  * Copyright (c) 2016, 2017, 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_G1HEAPVERIFIER_HPP
       
    26 #define SHARE_VM_GC_G1_G1HEAPVERIFIER_HPP
       
    27 
       
    28 #include "gc/g1/heapRegionSet.hpp"
       
    29 #include "memory/allocation.hpp"
       
    30 #include "memory/universe.hpp"
       
    31 
       
    32 class G1CollectedHeap;
       
    33 
       
    34 class G1HeapVerifier : public CHeapObj<mtGC> {
       
    35 private:
       
    36   G1CollectedHeap* _g1h;
       
    37 
       
    38   // verify_region_sets() performs verification over the region
       
    39   // lists. It will be compiled in the product code to be used when
       
    40   // necessary (i.e., during heap verification).
       
    41   void verify_region_sets();
       
    42 
       
    43 public:
       
    44 
       
    45   G1HeapVerifier(G1CollectedHeap* heap) : _g1h(heap) { }
       
    46 
       
    47   // Perform verification.
       
    48 
       
    49   // vo == UsePrevMarking  -> use "prev" marking information,
       
    50   // vo == UseNextMarking -> use "next" marking information
       
    51   // vo == UseMarkWord    -> use the mark word in the object header
       
    52   //
       
    53   // NOTE: Only the "prev" marking information is guaranteed to be
       
    54   // consistent most of the time, so most calls to this should use
       
    55   // vo == UsePrevMarking.
       
    56   // Currently, there is only one case where this is called with
       
    57   // vo == UseNextMarking, which is to verify the "next" marking
       
    58   // information at the end of remark.
       
    59   // Currently there is only one place where this is called with
       
    60   // vo == UseMarkWord, which is to verify the marking during a
       
    61   // full GC.
       
    62   void verify(VerifyOption vo);
       
    63 
       
    64   // verify_region_sets_optional() is planted in the code for
       
    65   // list verification in non-product builds (and it can be enabled in
       
    66   // product builds by defining HEAP_REGION_SET_FORCE_VERIFY to be 1).
       
    67 #if HEAP_REGION_SET_FORCE_VERIFY
       
    68   void verify_region_sets_optional() {
       
    69     verify_region_sets();
       
    70   }
       
    71 #else // HEAP_REGION_SET_FORCE_VERIFY
       
    72   void verify_region_sets_optional() { }
       
    73 #endif // HEAP_REGION_SET_FORCE_VERIFY
       
    74 
       
    75   void prepare_for_verify();
       
    76   double verify(bool guard, const char* msg);
       
    77   void verify_before_gc();
       
    78   void verify_after_gc();
       
    79 
       
    80 #ifndef PRODUCT
       
    81   // Make sure that the given bitmap has no marked objects in the
       
    82   // range [from,limit). If it does, print an error message and return
       
    83   // false. Otherwise, just return true. bitmap_name should be "prev"
       
    84   // or "next".
       
    85   bool verify_no_bits_over_tams(const char* bitmap_name, const G1CMBitMap* const bitmap,
       
    86                                 HeapWord* from, HeapWord* limit);
       
    87 
       
    88   // Verify that the prev / next bitmap range [tams,end) for the given
       
    89   // region has no marks. Return true if all is well, false if errors
       
    90   // are detected.
       
    91   bool verify_bitmaps(const char* caller, HeapRegion* hr);
       
    92 #endif // PRODUCT
       
    93 
       
    94   // If G1VerifyBitmaps is set, verify that the marking bitmaps for
       
    95   // the given region do not have any spurious marks. If errors are
       
    96   // detected, print appropriate error messages and crash.
       
    97   void check_bitmaps(const char* caller, HeapRegion* hr) PRODUCT_RETURN;
       
    98 
       
    99   // If G1VerifyBitmaps is set, verify that the marking bitmaps do not
       
   100   // have any spurious marks. If errors are detected, print
       
   101   // appropriate error messages and crash.
       
   102   void check_bitmaps(const char* caller) PRODUCT_RETURN;
       
   103 
       
   104   // Do sanity check on the contents of the in-cset fast test table.
       
   105   bool check_cset_fast_test() PRODUCT_RETURN_( return true; );
       
   106 
       
   107   void verify_card_table_cleanup() PRODUCT_RETURN;
       
   108 
       
   109   void verify_not_dirty_region(HeapRegion* hr) PRODUCT_RETURN;
       
   110   void verify_dirty_region(HeapRegion* hr) PRODUCT_RETURN;
       
   111   void verify_dirty_young_regions() PRODUCT_RETURN;
       
   112 
       
   113   static void verify_archive_regions();
       
   114 };
       
   115 
       
   116 #endif // SHARE_VM_GC_G1_G1HEAPVERIFIER_HPP