comparison src/share/vm/gc_implementation/g1/g1CardCounts.hpp @ 10246:194f52aa2f23

7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap Summary: Refactor G1's hot card cache and card counts table into their own files. Simplify the card counts table, including removing the encoding of the card index in each entry. The card counts table now has a 1:1 correspondence with the cards spanned by heap. Space for the card counts table is reserved from virtual memory (rather than C heap) during JVM startup and is committed/expanded when the heap is expanded. Changes were also reviewed-by Vitaly Davidovich. Reviewed-by: tschatzl, jmasa
author johnc
date Thu, 09 May 2013 11:16:39 -0700
parents
children bed55d125e37
comparison
equal deleted inserted replaced
10245:923ac8d1df95 10246:194f52aa2f23
1 /*
2 * Copyright (c) 2013, 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_IMPLEMENTATION_G1_G1CARDCOUNTS_HPP
26 #define SHARE_VM_GC_IMPLEMENTATION_G1_G1CARDCOUNTS_HPP
27
28 #include "memory/allocation.hpp"
29 #include "runtime/virtualspace.hpp"
30 #include "utilities/globalDefinitions.hpp"
31
32 class CardTableModRefBS;
33 class G1CollectedHeap;
34 class HeapRegion;
35
36 // Table to track the number of times a card has been refined. Once
37 // a card has been refined a certain number of times, it is
38 // considered 'hot' and its refinement is delayed by inserting the
39 // card into the hot card cache. The card will then be refined when
40 // it is evicted from the hot card cache, or when the hot card cache
41 // is 'drained' during the next evacuation pause.
42
43 class G1CardCounts: public CHeapObj<mtGC> {
44 G1CollectedHeap* _g1h;
45
46 // The table of counts
47 jubyte* _card_counts;
48
49 // Max capacity of the reserved space for the counts table
50 size_t _reserved_max_card_num;
51
52 // Max capacity of the committed space for the counts table
53 size_t _committed_max_card_num;
54
55 // Size of committed space for the counts table
56 size_t _committed_size;
57
58 // CardTable bottom.
59 const jbyte* _ct_bot;
60
61 // Barrier set
62 CardTableModRefBS* _ct_bs;
63
64 // The virtual memory backing the counts table
65 VirtualSpace _card_counts_storage;
66
67 // Returns true if the card counts table has been reserved.
68 bool has_reserved_count_table() { return _card_counts != NULL; }
69
70 // Returns true if the card counts table has been reserved and committed.
71 bool has_count_table() {
72 return has_reserved_count_table() && _committed_max_card_num > 0;
73 }
74
75 void check_card_num(size_t card_num, const char* msg) {
76 assert(card_num >= 0 && card_num < _committed_max_card_num, msg);
77 }
78
79 size_t ptr_2_card_num(const jbyte* card_ptr) {
80 assert(card_ptr >= _ct_bot,
81 err_msg("Inavalied card pointer: "
82 "card_ptr: " PTR_FORMAT ", "
83 "_ct_bot: " PTR_FORMAT,
84 card_ptr, _ct_bot));
85 size_t card_num = pointer_delta(card_ptr, _ct_bot, sizeof(jbyte));
86 check_card_num(card_num,
87 err_msg("card pointer out of range: " PTR_FORMAT, card_ptr));
88 return card_num;
89 }
90
91 jbyte* card_num_2_ptr(size_t card_num) {
92 check_card_num(card_num,
93 err_msg("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 ~G1CardCounts();
103
104 void initialize();
105
106 // Resize the committed space for the card counts table in
107 // response to a resize of the committed space for the heap.
108 void resize(size_t heap_capacity);
109
110 // Increments the refinement count for the given card.
111 // Returns the pre-increment count value.
112 uint add_card_count(jbyte* card_ptr);
113
114 // Returns true if the given count is high enough to be considered
115 // 'hot'; false otherwise.
116 bool is_hot(uint count);
117
118 // Clears the card counts for the cards spanned by the region
119 void clear_region(HeapRegion* hr);
120
121 // Clear the entire card counts table during GC.
122 // Updates the policy stats with the duration.
123 void clear_all();
124 };
125
126 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_G1CARDCOUNTS_HPP