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_G1FULLGCPREPARETASK_INLINE_HPP
26 #define SHARE_GC_G1_G1FULLGCPREPARETASK_INLINE_HPP
27
28 #include "gc/g1/g1FullGCPrepareTask.hpp"
29
30 #include "gc/g1/g1CollectedHeap.inline.hpp"
31 #include "gc/g1/g1FullCollector.hpp"
32 #include "gc/g1/g1FullGCCompactionPoint.hpp"
33 #include "gc/g1/g1FullGCScope.hpp"
34 #include "gc/g1/g1HeapRegion.inline.hpp"
35
36 void G1DetermineCompactionQueueClosure::free_empty_humongous_region(G1HeapRegion* hr) {
37 _g1h->free_humongous_region(hr, nullptr);
38 _collector->set_free(hr->hrm_index());
39 add_to_compaction_queue(hr);
40 }
41
42 inline bool G1DetermineCompactionQueueClosure::should_compact(G1HeapRegion* hr) const {
43 // There is no need to iterate and forward objects in non-movable regions ie.
44 // prepare them for compaction.
45 if (hr->is_humongous() || hr->has_pinned_objects()) {
46 return false;
47 }
48 size_t live_words = _collector->live_words(hr->hrm_index());
49 size_t live_words_threshold = _collector->scope()->region_compaction_threshold();
50 // High live ratio region will not be compacted.
51 return live_words <= live_words_threshold;
52 }
53
54 inline uint G1DetermineCompactionQueueClosure::next_worker() {
97 bool is_empty = !_collector->mark_bitmap()->is_marked(obj);
98 if (is_empty) {
99 free_empty_humongous_region(hr);
100 } else {
101 _collector->set_has_humongous();
102 }
103 } else {
104 assert(MarkSweepDeadRatio > 0,
105 "only skip compaction for other regions when MarkSweepDeadRatio > 0");
106
107 // Too many live objects in the region; skip compacting it.
108 _collector->update_from_compacting_to_skip_compacting(hr->hrm_index());
109 log_trace(gc, phases)("Phase 2: skip compaction region index: %u, live words: " SIZE_FORMAT,
110 hr->hrm_index(), _collector->live_words(hr->hrm_index()));
111 }
112
113 return false;
114 }
115
116 inline size_t G1SerialRePrepareClosure::apply(oop obj) {
117 if (obj->is_forwarded()) {
118 // We skip objects compiled into the first region or
119 // into regions not part of the serial compaction point.
120 if (cast_from_oop<HeapWord*>(obj->forwardee()) < _dense_prefix_top) {
121 return obj->size();
122 }
123 }
124
125 // Get size and forward.
126 size_t size = obj->size();
127 _cp->forward(obj, size);
128
129 return size;
130 }
131
132 #endif // SHARE_GC_G1_G1FULLGCPREPARETASK_INLINE_HPP
|
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_G1FULLGCPREPARETASK_INLINE_HPP
26 #define SHARE_GC_G1_G1FULLGCPREPARETASK_INLINE_HPP
27
28 #include "gc/g1/g1FullGCPrepareTask.hpp"
29
30 #include "gc/g1/g1CollectedHeap.inline.hpp"
31 #include "gc/g1/g1FullCollector.hpp"
32 #include "gc/g1/g1FullGCCompactionPoint.hpp"
33 #include "gc/g1/g1FullGCScope.hpp"
34 #include "gc/g1/g1HeapRegion.inline.hpp"
35 #include "gc/shared/slidingForwarding.inline.hpp"
36
37 void G1DetermineCompactionQueueClosure::free_empty_humongous_region(G1HeapRegion* hr) {
38 _g1h->free_humongous_region(hr, nullptr);
39 _collector->set_free(hr->hrm_index());
40 add_to_compaction_queue(hr);
41 }
42
43 inline bool G1DetermineCompactionQueueClosure::should_compact(G1HeapRegion* hr) const {
44 // There is no need to iterate and forward objects in non-movable regions ie.
45 // prepare them for compaction.
46 if (hr->is_humongous() || hr->has_pinned_objects()) {
47 return false;
48 }
49 size_t live_words = _collector->live_words(hr->hrm_index());
50 size_t live_words_threshold = _collector->scope()->region_compaction_threshold();
51 // High live ratio region will not be compacted.
52 return live_words <= live_words_threshold;
53 }
54
55 inline uint G1DetermineCompactionQueueClosure::next_worker() {
98 bool is_empty = !_collector->mark_bitmap()->is_marked(obj);
99 if (is_empty) {
100 free_empty_humongous_region(hr);
101 } else {
102 _collector->set_has_humongous();
103 }
104 } else {
105 assert(MarkSweepDeadRatio > 0,
106 "only skip compaction for other regions when MarkSweepDeadRatio > 0");
107
108 // Too many live objects in the region; skip compacting it.
109 _collector->update_from_compacting_to_skip_compacting(hr->hrm_index());
110 log_trace(gc, phases)("Phase 2: skip compaction region index: %u, live words: " SIZE_FORMAT,
111 hr->hrm_index(), _collector->live_words(hr->hrm_index()));
112 }
113
114 return false;
115 }
116
117 inline size_t G1SerialRePrepareClosure::apply(oop obj) {
118 if (SlidingForwarding::is_forwarded(obj)) {
119 // We skip objects compiled into the first region or
120 // into regions not part of the serial compaction point.
121 if (cast_from_oop<HeapWord*>(SlidingForwarding::forwardee(obj)) < _dense_prefix_top) {
122 return obj->size();
123 }
124 }
125
126 // Get size and forward.
127 size_t size = obj->size();
128 _cp->forward(obj, size);
129
130 return size;
131 }
132
133 #endif // SHARE_GC_G1_G1FULLGCPREPARETASK_INLINE_HPP
|