annotate src/share/vm/gc_implementation/parallelScavenge/psScavenge.hpp @ 10185:d50cc62e94ff

8012715: G1: GraphKit accesses PtrQueue::_index as int but is size_t Summary: In graphKit INT operations were generated to access PtrQueue::_index which has type size_t. This is 64 bit on 64-bit machines. No problems occur on little endian machines as long as the index fits into 32 bit, but on big endian machines the upper part is read, which is zero. This leads to unnecessary branches to the slow path in the runtime. Reviewed-by: twisti, johnc Contributed-by: Martin Doerr <martin.doerr@sap.com>
author johnc
date Wed, 24 Apr 2013 14:48:43 -0700
parents 22b8d3d181d9
children 47bdfb3d010f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
4909
95f6641e38e0 7144296: PS: Optimize nmethods processing
iveresov
parents: 1972
diff changeset
2 * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 196
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 196
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 196
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
25 #ifndef SHARE_VM_GC_IMPLEMENTATION_PARALLELSCAVENGE_PSSCAVENGE_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
26 #define SHARE_VM_GC_IMPLEMENTATION_PARALLELSCAVENGE_PSSCAVENGE_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
27
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
28 #include "gc_implementation/parallelScavenge/cardTableExtension.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
29 #include "gc_implementation/parallelScavenge/psVirtualspace.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
30 #include "gc_implementation/shared/collectorCounters.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
31 #include "memory/allocation.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
32 #include "oops/oop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
33 #include "utilities/stack.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
34
0
a61af66fc99e Initial load
duke
parents:
diff changeset
35 class GCTaskManager;
a61af66fc99e Initial load
duke
parents:
diff changeset
36 class GCTaskQueue;
a61af66fc99e Initial load
duke
parents:
diff changeset
37 class OopStack;
a61af66fc99e Initial load
duke
parents:
diff changeset
38 class ReferenceProcessor;
a61af66fc99e Initial load
duke
parents:
diff changeset
39 class ParallelScavengeHeap;
a61af66fc99e Initial load
duke
parents:
diff changeset
40 class PSIsAliveClosure;
a61af66fc99e Initial load
duke
parents:
diff changeset
41 class PSRefProcTaskExecutor;
a61af66fc99e Initial load
duke
parents:
diff changeset
42
a61af66fc99e Initial load
duke
parents:
diff changeset
43 class PSScavenge: AllStatic {
a61af66fc99e Initial load
duke
parents:
diff changeset
44 friend class PSIsAliveClosure;
a61af66fc99e Initial load
duke
parents:
diff changeset
45 friend class PSKeepAliveClosure;
a61af66fc99e Initial load
duke
parents:
diff changeset
46 friend class PSPromotionManager;
a61af66fc99e Initial load
duke
parents:
diff changeset
47
a61af66fc99e Initial load
duke
parents:
diff changeset
48 enum ScavengeSkippedCause {
a61af66fc99e Initial load
duke
parents:
diff changeset
49 not_skipped = 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
50 to_space_not_empty,
a61af66fc99e Initial load
duke
parents:
diff changeset
51 promoted_too_large,
a61af66fc99e Initial load
duke
parents:
diff changeset
52 full_follows_scavenge
a61af66fc99e Initial load
duke
parents:
diff changeset
53 };
a61af66fc99e Initial load
duke
parents:
diff changeset
54
a61af66fc99e Initial load
duke
parents:
diff changeset
55 // Saved value of to_space->top(), used to prevent objects in to_space from
a61af66fc99e Initial load
duke
parents:
diff changeset
56 // being rescanned.
a61af66fc99e Initial load
duke
parents:
diff changeset
57 static HeapWord* _to_space_top_before_gc;
a61af66fc99e Initial load
duke
parents:
diff changeset
58
a61af66fc99e Initial load
duke
parents:
diff changeset
59 // Number of consecutive attempts to scavenge that were skipped
a61af66fc99e Initial load
duke
parents:
diff changeset
60 static int _consecutive_skipped_scavenges;
a61af66fc99e Initial load
duke
parents:
diff changeset
61
a61af66fc99e Initial load
duke
parents:
diff changeset
62
a61af66fc99e Initial load
duke
parents:
diff changeset
63 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
64 // Flags/counters
a61af66fc99e Initial load
duke
parents:
diff changeset
65 static ReferenceProcessor* _ref_processor; // Reference processor for scavenging.
a61af66fc99e Initial load
duke
parents:
diff changeset
66 static PSIsAliveClosure _is_alive_closure; // Closure used for reference processing
a61af66fc99e Initial load
duke
parents:
diff changeset
67 static CardTableExtension* _card_table; // We cache the card table for fast access.
a61af66fc99e Initial load
duke
parents:
diff changeset
68 static bool _survivor_overflow; // Overflow this collection
6818
22b8d3d181d9 8000351: Tenuring threshold should be unsigned
jwilhelm
parents: 6725
diff changeset
69 static uint _tenuring_threshold; // tenuring threshold for next scavenge
0
a61af66fc99e Initial load
duke
parents:
diff changeset
70 static elapsedTimer _accumulated_time; // total time spent on scavenge
a61af66fc99e Initial load
duke
parents:
diff changeset
71 static HeapWord* _young_generation_boundary; // The lowest address possible for the young_gen.
a61af66fc99e Initial load
duke
parents:
diff changeset
72 // This is used to decide if an oop should be scavenged,
a61af66fc99e Initial load
duke
parents:
diff changeset
73 // cards should be marked, etc.
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 4913
diff changeset
74 static Stack<markOop, mtGC> _preserved_mark_stack; // List of marks to be restored after failed promotion
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 4913
diff changeset
75 static Stack<oop, mtGC> _preserved_oop_stack; // List of oops that need their mark restored.
6818
22b8d3d181d9 8000351: Tenuring threshold should be unsigned
jwilhelm
parents: 6725
diff changeset
76 static CollectorCounters* _counters; // collector performance counters
1836
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents: 1552
diff changeset
77 static bool _promotion_failed;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
78
a61af66fc99e Initial load
duke
parents:
diff changeset
79 static void clean_up_failed_promotion();
a61af66fc99e Initial load
duke
parents:
diff changeset
80
a61af66fc99e Initial load
duke
parents:
diff changeset
81 static bool should_attempt_scavenge();
a61af66fc99e Initial load
duke
parents:
diff changeset
82
a61af66fc99e Initial load
duke
parents:
diff changeset
83 static HeapWord* to_space_top_before_gc() { return _to_space_top_before_gc; }
a61af66fc99e Initial load
duke
parents:
diff changeset
84 static inline void save_to_space_top_before_gc();
a61af66fc99e Initial load
duke
parents:
diff changeset
85
a61af66fc99e Initial load
duke
parents:
diff changeset
86 // Private accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
87 static CardTableExtension* const card_table() { assert(_card_table != NULL, "Sanity"); return _card_table; }
a61af66fc99e Initial load
duke
parents:
diff changeset
88
a61af66fc99e Initial load
duke
parents:
diff changeset
89 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
90 // Accessors
6818
22b8d3d181d9 8000351: Tenuring threshold should be unsigned
jwilhelm
parents: 6725
diff changeset
91 static uint tenuring_threshold() { return _tenuring_threshold; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
92 static elapsedTimer* accumulated_time() { return &_accumulated_time; }
1836
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents: 1552
diff changeset
93 static bool promotion_failed() { return _promotion_failed; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
94 static int consecutive_skipped_scavenges()
a61af66fc99e Initial load
duke
parents:
diff changeset
95 { return _consecutive_skipped_scavenges; }
a61af66fc99e Initial load
duke
parents:
diff changeset
96
a61af66fc99e Initial load
duke
parents:
diff changeset
97 // Performance Counters
a61af66fc99e Initial load
duke
parents:
diff changeset
98 static CollectorCounters* counters() { return _counters; }
a61af66fc99e Initial load
duke
parents:
diff changeset
99
a61af66fc99e Initial load
duke
parents:
diff changeset
100 // Used by scavenge_contents && psMarkSweep
a61af66fc99e Initial load
duke
parents:
diff changeset
101 static ReferenceProcessor* const reference_processor() {
a61af66fc99e Initial load
duke
parents:
diff changeset
102 assert(_ref_processor != NULL, "Sanity");
a61af66fc99e Initial load
duke
parents:
diff changeset
103 return _ref_processor;
a61af66fc99e Initial load
duke
parents:
diff changeset
104 }
a61af66fc99e Initial load
duke
parents:
diff changeset
105 // Used to add tasks
a61af66fc99e Initial load
duke
parents:
diff changeset
106 static GCTaskManager* const gc_task_manager();
a61af66fc99e Initial load
duke
parents:
diff changeset
107 // The promotion managers tell us if they encountered overflow
a61af66fc99e Initial load
duke
parents:
diff changeset
108 static void set_survivor_overflow(bool state) {
a61af66fc99e Initial load
duke
parents:
diff changeset
109 _survivor_overflow = state;
a61af66fc99e Initial load
duke
parents:
diff changeset
110 }
a61af66fc99e Initial load
duke
parents:
diff changeset
111 // Adaptive size policy support. When the young generation/old generation
a61af66fc99e Initial load
duke
parents:
diff changeset
112 // boundary moves, _young_generation_boundary must be reset
a61af66fc99e Initial load
duke
parents:
diff changeset
113 static void set_young_generation_boundary(HeapWord* v) {
a61af66fc99e Initial load
duke
parents:
diff changeset
114 _young_generation_boundary = v;
a61af66fc99e Initial load
duke
parents:
diff changeset
115 }
a61af66fc99e Initial load
duke
parents:
diff changeset
116
a61af66fc99e Initial load
duke
parents:
diff changeset
117 // Called by parallelScavengeHeap to init the tenuring threshold
a61af66fc99e Initial load
duke
parents:
diff changeset
118 static void initialize();
a61af66fc99e Initial load
duke
parents:
diff changeset
119
4913
ab4422d0ed59 7146343: PS invoke methods should indicate the type of gc done
jcoomes
parents: 4909
diff changeset
120 // Scavenge entry point. This may invoke a full gc; return true if so.
ab4422d0ed59 7146343: PS invoke methods should indicate the type of gc done
jcoomes
parents: 4909
diff changeset
121 static bool invoke();
ab4422d0ed59 7146343: PS invoke methods should indicate the type of gc done
jcoomes
parents: 4909
diff changeset
122 // Return true if a collection was done; false otherwise.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
123 static bool invoke_no_policy();
a61af66fc99e Initial load
duke
parents:
diff changeset
124
a61af66fc99e Initial load
duke
parents:
diff changeset
125 // If an attempt to promote fails, this method is invoked
a61af66fc99e Initial load
duke
parents:
diff changeset
126 static void oop_promotion_failed(oop obj, markOop obj_mark);
a61af66fc99e Initial load
duke
parents:
diff changeset
127
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
128 template <class T> static inline bool should_scavenge(T* p);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
129
a61af66fc99e Initial load
duke
parents:
diff changeset
130 // These call should_scavenge() above and, if it returns true, also check that
a61af66fc99e Initial load
duke
parents:
diff changeset
131 // the object was not newly copied into to_space. The version with the bool
a61af66fc99e Initial load
duke
parents:
diff changeset
132 // argument is a convenience wrapper that fetches the to_space pointer from
a61af66fc99e Initial load
duke
parents:
diff changeset
133 // the heap and calls the other version (if the arg is true).
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
134 template <class T> static inline bool should_scavenge(T* p, MutableSpace* to_space);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
135 template <class T> static inline bool should_scavenge(T* p, bool check_to_space);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
136
4909
95f6641e38e0 7144296: PS: Optimize nmethods processing
iveresov
parents: 1972
diff changeset
137 template <class T, bool promote_immediately>
95f6641e38e0 7144296: PS: Optimize nmethods processing
iveresov
parents: 1972
diff changeset
138 inline static void copy_and_push_safe_barrier(PSPromotionManager* pm, T* p);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
139
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
140 static void copy_and_push_safe_barrier_from_klass(PSPromotionManager* pm, oop* p);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
141
0
a61af66fc99e Initial load
duke
parents:
diff changeset
142 // Is an object in the young generation
a61af66fc99e Initial load
duke
parents:
diff changeset
143 // This assumes that the HeapWord argument is in the heap,
a61af66fc99e Initial load
duke
parents:
diff changeset
144 // so it only checks one side of the complete predicate.
a61af66fc99e Initial load
duke
parents:
diff changeset
145 inline static bool is_obj_in_young(HeapWord* o) {
a61af66fc99e Initial load
duke
parents:
diff changeset
146 const bool result = (o >= _young_generation_boundary);
a61af66fc99e Initial load
duke
parents:
diff changeset
147 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
148 }
a61af66fc99e Initial load
duke
parents:
diff changeset
149 };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
150
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
151 #endif // SHARE_VM_GC_IMPLEMENTATION_PARALLELSCAVENGE_PSSCAVENGE_HPP