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_G1INCSETSTATE_HPP
26 #define SHARE_VM_GC_IMPLEMENTATION_G1_G1INCSETSTATE_HPP
27
28 #include "gc_implementation/g1/g1BiasedArray.hpp"
29 #include "memory/allocation.hpp"
30
31 // Per-region state during garbage collection.
32 struct InCSetState {
33 // We use different types to represent the state value. Particularly SPARC puts
34 // values in structs from "left to right", i.e. MSB to LSB. This results in many
35 // unnecessary shift operations when loading and storing values of this type.
36 // This degrades performance significantly (>10%) on that platform.
37 // Other tested ABIs do not seem to have this problem, and actually tend to
38 // favor smaller types, so we use the smallest usable type there.
39 SPARC_ONLY(typedef intptr_t in_cset_state_t;)
40 NOT_SPARC(typedef int8_t in_cset_state_t;)
41
42 in_cset_state_t _value;
43 public:
44 enum {
45 // Selection of the values were driven to micro-optimize the encoding and
46 // frequency of the checks.
47 // The most common check is whether the region is in the collection set or not.
48 // This encoding allows us to use an != 0 check which in some architectures
49 // (x86*) can be encoded slightly more efficently than a normal comparison
50 // against zero.
51 // The same situation occurs when checking whether the region is humongous
52 // or not, which is encoded by values < 0.
58 Old = 2, // The region is in the collection set and an old region.
59 Num
60 };
61
62 InCSetState() { _value = NotInCSet; }
63 InCSetState(in_cset_state_t value) { _value = value; }
64
65 in_cset_state_t value() const { return _value; }
66
67 void set_old() { _value = Old; }
68
69 bool is_not_in_cset() const { return _value == NotInCSet; }
70 bool is_in_cset_or_humongous() const { return _value != NotInCSet; }
71 bool is_in_cset() const { return _value > NotInCSet; }
72 bool is_humongous() const { return _value < NotInCSet; }
73 bool is_young() const { return _value == Young; }
74 bool is_old() const { return _value == Old; }
75
76 #ifdef ASSERT
77 bool is_default() const { return is_not_in_cset(); }
78 bool is_valid() const { return _value < Num; }
79 bool is_valid_gen() const { return (_value >= Young && _value <= Old); }
80 #endif
81 };
82
83 // Instances of this class are used for quick tests on whether a reference points
84 // into the collection set and into which generation or is a humongous object
85 //
86 // Each of the array's elements indicates whether the corresponding region is in
87 // the collection set and if so in which generation, or a humongous region.
88 //
89 // We use this to speed up reference processing during young collection and
90 // quickly reclaim humongous objects. For the latter, by making a humongous region
91 // succeed this test, we sort-of add it to the collection set. During the reference
92 // iteration closures, when we see a humongous region, we then simply mark it as
93 // referenced, i.e. live.
94 class G1InCSetStateFastTestBiasedMappedArray : public G1BiasedMappedArray<InCSetState> {
95 protected:
96 InCSetState default_value() const { return InCSetState::NotInCSet; }
97 public:
98 void set_humongous(uintptr_t index) {
|
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_G1INCSETSTATE_HPP
26 #define SHARE_VM_GC_IMPLEMENTATION_G1_G1INCSETSTATE_HPP
27
28 #include "gc_implementation/g1/g1BiasedArray.hpp"
29 #include "memory/allocation.hpp"
30
31 // Per-region state during garbage collection.
32 struct InCSetState {
33 private:
34 // We use different types to represent the state value. Particularly SPARC puts
35 // values in structs from "left to right", i.e. MSB to LSB. This results in many
36 // unnecessary shift operations when loading and storing values of this type.
37 // This degrades performance significantly (>10%) on that platform.
38 // Other tested ABIs do not seem to have this problem, and actually tend to
39 // favor smaller types, so we use the smallest usable type there.
40 SPARC_ONLY(typedef intptr_t in_cset_state_t;)
41 NOT_SPARC(typedef int8_t in_cset_state_t;)
42
43 in_cset_state_t _value;
44 public:
45 enum {
46 // Selection of the values were driven to micro-optimize the encoding and
47 // frequency of the checks.
48 // The most common check is whether the region is in the collection set or not.
49 // This encoding allows us to use an != 0 check which in some architectures
50 // (x86*) can be encoded slightly more efficently than a normal comparison
51 // against zero.
52 // The same situation occurs when checking whether the region is humongous
53 // or not, which is encoded by values < 0.
59 Old = 2, // The region is in the collection set and an old region.
60 Num
61 };
62
63 InCSetState() { _value = NotInCSet; }
64 InCSetState(in_cset_state_t value) { _value = value; }
65
66 in_cset_state_t value() const { return _value; }
67
68 void set_old() { _value = Old; }
69
70 bool is_not_in_cset() const { return _value == NotInCSet; }
71 bool is_in_cset_or_humongous() const { return _value != NotInCSet; }
72 bool is_in_cset() const { return _value > NotInCSet; }
73 bool is_humongous() const { return _value < NotInCSet; }
74 bool is_young() const { return _value == Young; }
75 bool is_old() const { return _value == Old; }
76
77 #ifdef ASSERT
78 bool is_default() const { return is_not_in_cset(); }
79 bool is_valid() const { return (_value >= Humongous) && (_value < Num); }
80 bool is_valid_gen() const { return (_value >= Young && _value <= Old); }
81 #endif
82 };
83
84 // Instances of this class are used for quick tests on whether a reference points
85 // into the collection set and into which generation or is a humongous object
86 //
87 // Each of the array's elements indicates whether the corresponding region is in
88 // the collection set and if so in which generation, or a humongous region.
89 //
90 // We use this to speed up reference processing during young collection and
91 // quickly reclaim humongous objects. For the latter, by making a humongous region
92 // succeed this test, we sort-of add it to the collection set. During the reference
93 // iteration closures, when we see a humongous region, we then simply mark it as
94 // referenced, i.e. live.
95 class G1InCSetStateFastTestBiasedMappedArray : public G1BiasedMappedArray<InCSetState> {
96 protected:
97 InCSetState default_value() const { return InCSetState::NotInCSet; }
98 public:
99 void set_humongous(uintptr_t index) {
|