annotate src/share/vm/gc_implementation/g1/g1OopClosures.inline.hpp @ 4837:eff609af17d7

7127706: G1: re-enable survivors during the initial-mark pause Summary: Re-enable survivors during the initial-mark pause. Afterwards, the concurrent marking threads have to scan them and mark everything reachable from them. The next GC will have to wait for the survivors to be scanned. Reviewed-by: brutisso, johnc
author tonyp
date Wed, 25 Jan 2012 12:58:23 -0500
parents 4406629aa157
children b4ebad3520bb
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 /*
4837
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4126
diff changeset
2 * Copyright (c) 2001, 2012, 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: 1261
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1261
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: 1261
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: 1705
diff changeset
25 #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_G1OOPCLOSURES_INLINE_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1705
diff changeset
26 #define SHARE_VM_GC_IMPLEMENTATION_G1_G1OOPCLOSURES_INLINE_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1705
diff changeset
27
3771
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents: 3765
diff changeset
28 #include "gc_implementation/g1/concurrentMark.inline.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1705
diff changeset
29 #include "gc_implementation/g1/g1CollectedHeap.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1705
diff changeset
30 #include "gc_implementation/g1/g1OopClosures.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1705
diff changeset
31 #include "gc_implementation/g1/g1RemSet.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1705
diff changeset
32
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
33 /*
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
34 * This really ought to be an inline function, but apparently the C++
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
35 * compiler sometimes sees fit to ignore inline declarations. Sigh.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
36 */
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
37
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
38 // This must a ifdef'ed because the counting it controls is in a
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
39 // perf-critical inner loop.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
40 #define FILTERINTOCSCLOSURE_DOHISTOGRAMCOUNT 0
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
41
4837
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4126
diff changeset
42 template <class T>
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4126
diff changeset
43 inline void FilterIntoCSClosure::do_oop_nv(T* p) {
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
44 T heap_oop = oopDesc::load_heap_oop(p);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
45 if (!oopDesc::is_null(heap_oop) &&
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
46 _g1->obj_in_cs(oopDesc::decode_heap_oop_not_null(heap_oop))) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
47 _oc->do_oop(p);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
48 #if FILTERINTOCSCLOSURE_DOHISTOGRAMCOUNT
1705
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1552
diff changeset
49 if (_dcto_cl != NULL)
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1552
diff changeset
50 _dcto_cl->incr_count();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
51 #endif
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
52 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
53 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
54
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
55 #define FILTEROUTOFREGIONCLOSURE_DOHISTOGRAMCOUNT 0
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
56
4837
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4126
diff changeset
57 template <class T>
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4126
diff changeset
58 inline void FilterOutOfRegionClosure::do_oop_nv(T* p) {
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
59 T heap_oop = oopDesc::load_heap_oop(p);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
60 if (!oopDesc::is_null(heap_oop)) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
61 HeapWord* obj_hw = (HeapWord*)oopDesc::decode_heap_oop_not_null(heap_oop);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
62 if (obj_hw < _r_bottom || obj_hw >= _r_end) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
63 _oc->do_oop(p);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
64 #if FILTEROUTOFREGIONCLOSURE_DOHISTOGRAMCOUNT
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
65 _out_of_region++;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
66 #endif
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
67 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
68 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
69 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
70
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
71 // This closure is applied to the fields of the objects that have just been copied.
4837
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4126
diff changeset
72 template <class T>
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4126
diff changeset
73 inline void G1ParScanClosure::do_oop_nv(T* p) {
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
74 T heap_oop = oopDesc::load_heap_oop(p);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
75
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
76 if (!oopDesc::is_null(heap_oop)) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
77 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
78 if (_g1->in_cset_fast_test(obj)) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
79 // We're not going to even bother checking whether the object is
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
80 // already forwarded or not, as this usually causes an immediate
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
81 // stall. We'll try to prefetch the object (for write, given that
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
82 // we might need to install the forwarding reference) and we'll
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
83 // get back to it when pop it from the queue
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
84 Prefetch::write(obj->mark_addr(), 0);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
85 Prefetch::read(obj->mark_addr(), (HeapWordSize*2));
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
86
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
87 // slightly paranoid test; I'm trying to catch potential
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
88 // problems before we go into push_on_queue to know where the
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
89 // problem is coming from
4126
4406629aa157 7114095: G1: assert(obj == oopDesc::load_decode_heap_oop(p)) failed: p should still be pointing to obj
johnc
parents: 3771
diff changeset
90 assert((obj == oopDesc::load_decode_heap_oop(p)) ||
4406629aa157 7114095: G1: assert(obj == oopDesc::load_decode_heap_oop(p)) failed: p should still be pointing to obj
johnc
parents: 3771
diff changeset
91 (obj->is_forwarded() &&
4406629aa157 7114095: G1: assert(obj == oopDesc::load_decode_heap_oop(p)) failed: p should still be pointing to obj
johnc
parents: 3771
diff changeset
92 obj->forwardee() == oopDesc::load_decode_heap_oop(p)),
4406629aa157 7114095: G1: assert(obj == oopDesc::load_decode_heap_oop(p)) failed: p should still be pointing to obj
johnc
parents: 3771
diff changeset
93 "p should still be pointing to obj or to its forwardee");
4406629aa157 7114095: G1: assert(obj == oopDesc::load_decode_heap_oop(p)) failed: p should still be pointing to obj
johnc
parents: 3771
diff changeset
94
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
95 _par_scan_state->push_on_queue(p);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
96 } else {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
97 _par_scan_state->update_rs(_from, p, _par_scan_state->queue_num());
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 342
diff changeset
98 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
99 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
100 }
1261
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 845
diff changeset
101
4837
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4126
diff changeset
102 template <class T>
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4126
diff changeset
103 inline void G1ParPushHeapRSClosure::do_oop_nv(T* p) {
1261
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 845
diff changeset
104 T heap_oop = oopDesc::load_heap_oop(p);
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 845
diff changeset
105
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 845
diff changeset
106 if (!oopDesc::is_null(heap_oop)) {
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 845
diff changeset
107 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 845
diff changeset
108 if (_g1->in_cset_fast_test(obj)) {
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 845
diff changeset
109 Prefetch::write(obj->mark_addr(), 0);
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 845
diff changeset
110 Prefetch::read(obj->mark_addr(), (HeapWordSize*2));
1705
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1552
diff changeset
111
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1552
diff changeset
112 // Place on the references queue
1261
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 845
diff changeset
113 _par_scan_state->push_on_queue(p);
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 845
diff changeset
114 }
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 845
diff changeset
115 }
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 845
diff changeset
116 }
1705
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1552
diff changeset
117
4837
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4126
diff changeset
118 template <class T>
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4126
diff changeset
119 inline void G1CMOopClosure::do_oop_nv(T* p) {
3771
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents: 3765
diff changeset
120 assert(_g1h->is_in_g1_reserved((HeapWord*) p), "invariant");
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents: 3765
diff changeset
121 assert(!_g1h->is_on_master_free_list(
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents: 3765
diff changeset
122 _g1h->heap_region_containing((HeapWord*) p)), "invariant");
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents: 3765
diff changeset
123
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents: 3765
diff changeset
124 oop obj = oopDesc::load_decode_heap_oop(p);
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents: 3765
diff changeset
125 if (_cm->verbose_high()) {
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents: 3765
diff changeset
126 gclog_or_tty->print_cr("[%d] we're looking at location "
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents: 3765
diff changeset
127 "*"PTR_FORMAT" = "PTR_FORMAT,
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents: 3765
diff changeset
128 _task->task_id(), p, (void*) obj);
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents: 3765
diff changeset
129 }
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents: 3765
diff changeset
130 _task->deal_with_reference(obj);
842b840e67db 7046558: G1: concurrent marking optimizations
tonyp
parents: 3765
diff changeset
131 }
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1705
diff changeset
132
4837
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4126
diff changeset
133 template <class T>
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4126
diff changeset
134 inline void G1RootRegionScanClosure::do_oop_nv(T* p) {
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4126
diff changeset
135 T heap_oop = oopDesc::load_heap_oop(p);
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4126
diff changeset
136 if (!oopDesc::is_null(heap_oop)) {
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4126
diff changeset
137 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4126
diff changeset
138 HeapRegion* hr = _g1h->heap_region_containing((HeapWord*) obj);
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4126
diff changeset
139 if (hr != NULL) {
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4126
diff changeset
140 _cm->grayRoot(obj, obj->size(), _worker_id, hr);
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4126
diff changeset
141 }
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4126
diff changeset
142 }
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4126
diff changeset
143 }
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4126
diff changeset
144
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1705
diff changeset
145 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_G1OOPCLOSURES_INLINE_HPP