annotate src/share/vm/gc_implementation/g1/g1CollectedHeap.inline.hpp @ 1973:631f79e71e90

6974966: G1: unnecessary direct-to-old allocations Summary: This change revamps the slow allocation path of G1. Improvements include the following: a) Allocations directly to old regions are now totally banned. G1 now only allows allocations out of young regions (with the only exception being humongous regions). b) The thread that allocates a new region (which is now guaranteed to be young) does not dirty all its cards. Each thread that successfully allocates out of a young region is now responsible for dirtying the cards that corresponding to the "block" that just got allocated. c) allocate_new_tlab() and mem_allocate() are now implemented differently and TLAB allocations are only done by allocate_new_tlab(). d) If a thread schedules an evacuation pause in order to satisfy an allocation request, it will perform the allocation at the end of the safepoint so that the thread that initiated the GC also gets "first pick" of any space made available by the GC. e) If a thread is unable to allocate a humongous object it will schedule an evacuation pause in case it reclaims enough regions so that the humongous allocation can be satisfied aftewards. f) The G1 policy is more careful to set the young list target length to be the survivor number +1. g) Lots of code tidy up, removal, refactoring to make future changes easier. Reviewed-by: johnc, ysr
author tonyp
date Tue, 24 Aug 2010 17:24:33 -0400
parents f95d63e2154a
children 016a3628c885
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1 /*
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1718
diff changeset
2 * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4 *
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
7 * published by the Free Software Foundation.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
8 *
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
13 * accompanied this code).
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
14 *
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 752
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 752
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: 752
diff changeset
21 * questions.
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
22 *
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
23 */
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1718
diff changeset
25 #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_G1COLLECTEDHEAP_INLINE_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1718
diff changeset
26 #define SHARE_VM_GC_IMPLEMENTATION_G1_G1COLLECTEDHEAP_INLINE_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1718
diff changeset
27
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1718
diff changeset
28 #include "gc_implementation/g1/concurrentMark.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1718
diff changeset
29 #include "gc_implementation/g1/g1CollectedHeap.hpp"
1973
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
30 #include "gc_implementation/g1/g1CollectorPolicy.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1718
diff changeset
31 #include "gc_implementation/g1/heapRegionSeq.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1718
diff changeset
32 #include "utilities/taskqueue.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1718
diff changeset
33
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
34 // Inline functions for G1CollectedHeap
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
35
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
36 inline HeapRegion*
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
37 G1CollectedHeap::heap_region_containing(const void* addr) const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
38 HeapRegion* hr = _hrs->addr_to_region(addr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
39 // hr can be null if addr in perm_gen
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
40 if (hr != NULL && hr->continuesHumongous()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
41 hr = hr->humongous_start_region();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
42 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
43 return hr;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
44 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
45
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
46 inline HeapRegion*
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
47 G1CollectedHeap::heap_region_containing_raw(const void* addr) const {
526
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 342
diff changeset
48 assert(_g1_reserved.contains(addr), "invariant");
752
a2957df801a1 6833576: G1: assert illegal index, growableArray.hpp:186
johnc
parents: 579
diff changeset
49 size_t index = pointer_delta(addr, _g1_reserved.start(), 1)
a2957df801a1 6833576: G1: assert illegal index, growableArray.hpp:186
johnc
parents: 579
diff changeset
50 >> HeapRegion::LogOfHRGrainBytes;
a2957df801a1 6833576: G1: assert illegal index, growableArray.hpp:186
johnc
parents: 579
diff changeset
51
526
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 342
diff changeset
52 HeapRegion* res = _hrs->at(index);
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 342
diff changeset
53 assert(res == _hrs->addr_to_region(addr), "sanity");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
54 return res;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
55 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
56
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
57 inline bool G1CollectedHeap::obj_in_cs(oop obj) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
58 HeapRegion* r = _hrs->addr_to_region(obj);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
59 return r != NULL && r->in_collection_set();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
60 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
61
1973
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
62 // See the comment in the .hpp file about the locking protocol and
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
63 // assumptions of this method (and other related ones).
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
64 inline HeapWord*
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
65 G1CollectedHeap::allocate_from_cur_alloc_region(HeapRegion* cur_alloc_region,
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
66 size_t word_size) {
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
67 assert_heap_locked_and_not_at_safepoint();
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
68 assert(cur_alloc_region != NULL, "pre-condition of the method");
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
69 assert(cur_alloc_region == _cur_alloc_region, "pre-condition of the method");
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
70 assert(cur_alloc_region->is_young(),
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
71 "we only support young current alloc regions");
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
72 assert(!isHumongous(word_size), "allocate_from_cur_alloc_region() "
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
73 "should not be used for humongous allocations");
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
74 assert(!cur_alloc_region->isHumongous(), "Catch a regression of this bug.");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
75
1973
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
76 assert(!cur_alloc_region->is_empty(),
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
77 err_msg("region ["PTR_FORMAT","PTR_FORMAT"] should not be empty",
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
78 cur_alloc_region->bottom(), cur_alloc_region->end()));
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
79 // This allocate method does BOT updates and we don't need them in
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
80 // the young generation. This will be fixed in the near future by
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
81 // CR 6994297.
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
82 HeapWord* result = cur_alloc_region->allocate(word_size);
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
83 if (result != NULL) {
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
84 assert(is_in(result), "result should be in the heap");
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
85 Heap_lock->unlock();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
86
1973
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
87 // Do the dirtying after we release the Heap_lock.
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
88 dirty_young_block(result, word_size);
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
89 return result;
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
90 }
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
91
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
92 assert_heap_locked();
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
93 return NULL;
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
94 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
95
1973
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
96 // See the comment in the .hpp file about the locking protocol and
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
97 // assumptions of this method (and other related ones).
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
98 inline HeapWord*
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
99 G1CollectedHeap::attempt_allocation(size_t word_size) {
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
100 assert_heap_locked_and_not_at_safepoint();
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
101 assert(!isHumongous(word_size), "attempt_allocation() should not be called "
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
102 "for humongous allocation requests");
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
103
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
104 HeapRegion* cur_alloc_region = _cur_alloc_region;
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
105 if (cur_alloc_region != NULL) {
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
106 HeapWord* result = allocate_from_cur_alloc_region(cur_alloc_region,
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
107 word_size);
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
108 if (result != NULL) {
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
109 assert_heap_not_locked();
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
110 return result;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
111 }
1718
bb847e31b836 6974928: G1: sometimes humongous objects are allocated in young regions
tonyp
parents: 1709
diff changeset
112
1973
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
113 assert_heap_locked();
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
114
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
115 // Since we couldn't successfully allocate into it, retire the
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
116 // current alloc region.
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
117 retire_cur_alloc_region(cur_alloc_region);
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
118 }
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
119
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
120 // Try to get a new region and allocate out of it
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
121 HeapWord* result = replace_cur_alloc_region_and_allocate(word_size,
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
122 false, /* at safepoint */
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
123 true /* do_dirtying */);
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
124 if (result != NULL) {
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
125 assert_heap_not_locked();
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
126 return result;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
127 }
1973
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
128
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
129 assert_heap_locked();
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
130 return NULL;
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
131 }
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
132
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
133 inline void
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
134 G1CollectedHeap::retire_cur_alloc_region_common(HeapRegion* cur_alloc_region) {
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
135 assert_heap_locked_or_at_safepoint();
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
136 assert(cur_alloc_region != NULL && cur_alloc_region == _cur_alloc_region,
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
137 "pre-condition of the call");
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
138 assert(cur_alloc_region->is_young(),
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
139 "we only support young current alloc regions");
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
140
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
141 // The region is guaranteed to be young
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
142 g1_policy()->add_region_to_incremental_cset_lhs(cur_alloc_region);
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
143 _summary_bytes_used += cur_alloc_region->used();
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
144 _cur_alloc_region = NULL;
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
145 }
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
146
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
147 // It dirties the cards that cover the block so that so that the post
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
148 // write barrier never queues anything when updating objects on this
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
149 // block. It is assumed (and in fact we assert) that the block
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
150 // belongs to a young region.
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
151 inline void
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
152 G1CollectedHeap::dirty_young_block(HeapWord* start, size_t word_size) {
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
153 assert_heap_not_locked();
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
154
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
155 // Assign the containing region to containing_hr so that we don't
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
156 // have to keep calling heap_region_containing_raw() in the
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
157 // asserts below.
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
158 DEBUG_ONLY(HeapRegion* containing_hr = heap_region_containing_raw(start);)
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
159 assert(containing_hr != NULL && start != NULL && word_size > 0,
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
160 "pre-condition");
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
161 assert(containing_hr->is_in(start), "it should contain start");
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
162 assert(containing_hr->is_young(), "it should be young");
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
163 assert(!containing_hr->isHumongous(), "it should not be humongous");
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
164
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
165 HeapWord* end = start + word_size;
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
166 assert(containing_hr->is_in(end - 1), "it should also contain end - 1");
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
167
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
168 MemRegion mr(start, end);
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
169 ((CardTableModRefBS*)_g1h->barrier_set())->dirty(mr);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
170 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
171
1709
5f429ee79634 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 1552
diff changeset
172 inline RefToScanQueue* G1CollectedHeap::task_queue(int i) const {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
173 return _task_queues->queue(i);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
174 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
175
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
176 inline bool G1CollectedHeap::isMarkedPrev(oop obj) const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
177 return _cm->prevMarkBitMap()->isMarked((HeapWord *)obj);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
178 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
179
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
180 inline bool G1CollectedHeap::isMarkedNext(oop obj) const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
181 return _cm->nextMarkBitMap()->isMarked((HeapWord *)obj);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
182 }
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1718
diff changeset
183
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1718
diff changeset
184 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_G1COLLECTEDHEAP_INLINE_HPP