1 | /* |
2 | * Copyright (c) 2016, 2019, 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_GC_G1_G1HEAPVERIFIER_HPP |
26 | #define SHARE_GC_G1_G1HEAPVERIFIER_HPP |
27 | |
28 | #include "gc/g1/heapRegionSet.hpp" |
29 | #include "gc/shared/verifyOption.hpp" |
30 | #include "memory/allocation.hpp" |
31 | #include "utilities/macros.hpp" |
32 | |
33 | class G1CollectedHeap; |
34 | |
35 | class G1HeapVerifier : public CHeapObj<mtGC> { |
36 | private: |
37 | static int _enabled_verification_types; |
38 | |
39 | G1CollectedHeap* _g1h; |
40 | |
41 | void verify_region_sets(); |
42 | |
43 | public: |
44 | enum G1VerifyType { |
45 | G1VerifyYoungNormal = 1, // -XX:VerifyGCType=young-normal |
46 | G1VerifyConcurrentStart = 2, // -XX:VerifyGCType=concurrent-start |
47 | G1VerifyMixed = 4, // -XX:VerifyGCType=mixed |
48 | = 8, // -XX:VerifyGCType=remark |
49 | G1VerifyCleanup = 16, // -XX:VerifyGCType=cleanup |
50 | G1VerifyFull = 32, // -XX:VerifyGCType=full |
51 | G1VerifyAll = -1 |
52 | }; |
53 | |
54 | G1HeapVerifier(G1CollectedHeap* heap) : _g1h(heap) {} |
55 | |
56 | static void enable_verification_type(G1VerifyType type); |
57 | static bool should_verify(G1VerifyType type); |
58 | |
59 | // Perform verification. |
60 | |
61 | // vo == UsePrevMarking -> use "prev" marking information, |
62 | // vo == UseNextMarking -> use "next" marking information |
63 | // vo == UseFullMarking -> use "next" marking bitmap but no TAMS |
64 | // |
65 | // NOTE: Only the "prev" marking information is guaranteed to be |
66 | // consistent most of the time, so most calls to this should use |
67 | // vo == UsePrevMarking. |
68 | // Currently, there is only one case where this is called with |
69 | // vo == UseNextMarking, which is to verify the "next" marking |
70 | // information at the end of remark. |
71 | // Currently there is only one place where this is called with |
72 | // vo == UseFullMarking, which is to verify the marking during a |
73 | // full GC. |
74 | void verify(VerifyOption vo); |
75 | |
76 | // verify_region_sets_optional() is planted in the code for |
77 | // list verification in debug builds. |
78 | void verify_region_sets_optional() { DEBUG_ONLY(verify_region_sets();) } |
79 | |
80 | void prepare_for_verify(); |
81 | double verify(G1VerifyType type, VerifyOption vo, const char* msg); |
82 | void verify_before_gc(G1VerifyType type); |
83 | void verify_after_gc(G1VerifyType type); |
84 | |
85 | #ifndef PRODUCT |
86 | // Make sure that the given bitmap has no marked objects in the |
87 | // range [from,limit). If it does, print an error message and return |
88 | // false. Otherwise, just return true. bitmap_name should be "prev" |
89 | // or "next". |
90 | bool verify_no_bits_over_tams(const char* bitmap_name, const G1CMBitMap* const bitmap, |
91 | HeapWord* from, HeapWord* limit); |
92 | |
93 | // Verify that the prev / next bitmap range [tams,end) for the given |
94 | // region has no marks. Return true if all is well, false if errors |
95 | // are detected. |
96 | bool verify_bitmaps(const char* caller, HeapRegion* hr); |
97 | #endif // PRODUCT |
98 | |
99 | // If G1VerifyBitmaps is set, verify that the marking bitmaps for |
100 | // the given region do not have any spurious marks. If errors are |
101 | // detected, print appropriate error messages and crash. |
102 | void check_bitmaps(const char* caller, HeapRegion* hr) PRODUCT_RETURN; |
103 | |
104 | // If G1VerifyBitmaps is set, verify that the marking bitmaps do not |
105 | // have any spurious marks. If errors are detected, print |
106 | // appropriate error messages and crash. |
107 | void check_bitmaps(const char* caller) PRODUCT_RETURN; |
108 | |
109 | // Do sanity check on the contents of the in-cset fast test table. |
110 | bool check_region_attr_table() PRODUCT_RETURN_( return true; ); |
111 | |
112 | void verify_card_table_cleanup() PRODUCT_RETURN; |
113 | |
114 | void verify_not_dirty_region(HeapRegion* hr) PRODUCT_RETURN; |
115 | void verify_dirty_region(HeapRegion* hr) PRODUCT_RETURN; |
116 | void verify_dirty_young_regions() PRODUCT_RETURN; |
117 | |
118 | static void verify_ready_for_archiving(); |
119 | static void verify_archive_regions(); |
120 | }; |
121 | |
122 | #endif // SHARE_GC_G1_G1HEAPVERIFIER_HPP |
123 | |