Mercurial > hg > truffle
annotate src/share/vm/gc_implementation/g1/heapRegion.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 | 2ace1c4ee8da |
children | 8a2e5a6a19a4 |
rev | line source |
---|---|
342 | 1 /* |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
2 * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. |
342 | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
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 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
342
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
342
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:
342
diff
changeset
|
21 * questions. |
342 | 22 * |
23 */ | |
24 | |
1972 | 25 #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_HEAPREGION_INLINE_HPP |
26 #define SHARE_VM_GC_IMPLEMENTATION_G1_HEAPREGION_INLINE_HPP | |
27 | |
342 | 28 inline HeapWord* G1OffsetTableContigSpace::allocate(size_t size) { |
29 HeapWord* res = ContiguousSpace::allocate(size); | |
30 if (res != NULL) { | |
31 _offsets.alloc_block(res, size); | |
32 } | |
33 return res; | |
34 } | |
35 | |
36 // Because of the requirement of keeping "_offsets" up to date with the | |
37 // allocations, we sequentialize these with a lock. Therefore, best if | |
38 // this is used for larger LAB allocations only. | |
39 inline HeapWord* G1OffsetTableContigSpace::par_allocate(size_t size) { | |
40 MutexLocker x(&_par_alloc_lock); | |
2433
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
1972
diff
changeset
|
41 // Given that we take the lock no need to use par_allocate() here. |
abdfc822206f
7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents:
1972
diff
changeset
|
42 HeapWord* res = ContiguousSpace::allocate(size); |
342 | 43 if (res != NULL) { |
44 _offsets.alloc_block(res, size); | |
45 } | |
46 return res; | |
47 } | |
48 | |
49 inline HeapWord* G1OffsetTableContigSpace::block_start(const void* p) { | |
50 return _offsets.block_start(p); | |
51 } | |
52 | |
53 inline HeapWord* | |
54 G1OffsetTableContigSpace::block_start_const(const void* p) const { | |
55 return _offsets.block_start_const(p); | |
56 } | |
1972 | 57 |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
58 inline void HeapRegion::note_start_of_marking() { |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
59 init_top_at_conc_mark_count(); |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
60 _next_marked_bytes = 0; |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
61 _next_top_at_mark_start = top(); |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
62 } |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
63 |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
64 inline void HeapRegion::note_end_of_marking() { |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
65 _prev_top_at_mark_start = _next_top_at_mark_start; |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
66 _prev_marked_bytes = _next_marked_bytes; |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
67 _next_marked_bytes = 0; |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
68 |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
69 assert(_prev_marked_bytes <= |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
70 (size_t) pointer_delta(prev_top_at_mark_start(), bottom()) * |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
71 HeapWordSize, "invariant"); |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
72 } |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
73 |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
74 inline void HeapRegion::note_start_of_copying(bool during_initial_mark) { |
4837
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4787
diff
changeset
|
75 if (is_survivor()) { |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4787
diff
changeset
|
76 // This is how we always allocate survivors. |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4787
diff
changeset
|
77 assert(_next_top_at_mark_start == bottom(), "invariant"); |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4787
diff
changeset
|
78 } else { |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4787
diff
changeset
|
79 if (during_initial_mark) { |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
80 // During initial-mark we'll explicitly mark any objects on old |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
81 // regions that are pointed to by roots. Given that explicit |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
82 // marks only make sense under NTAMS it'd be nice if we could |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
83 // check that condition if we wanted to. Given that we don't |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
84 // know where the top of this region will end up, we simply set |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
85 // NTAMS to the end of the region so all marks will be below |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
86 // NTAMS. We'll set it to the actual top when we retire this region. |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
87 _next_top_at_mark_start = end(); |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
88 } else { |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
89 // We could have re-used this old region as to-space over a |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
90 // couple of GCs since the start of the concurrent marking |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
91 // cycle. This means that [bottom,NTAMS) will contain objects |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
92 // copied up to and including initial-mark and [NTAMS, top) |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
93 // will contain objects copied during the concurrent marking cycle. |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
94 assert(top() >= _next_top_at_mark_start, "invariant"); |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
95 } |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
96 } |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
97 } |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
98 |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
99 inline void HeapRegion::note_end_of_copying(bool during_initial_mark) { |
4837
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4787
diff
changeset
|
100 if (is_survivor()) { |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4787
diff
changeset
|
101 // This is how we always allocate survivors. |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4787
diff
changeset
|
102 assert(_next_top_at_mark_start == bottom(), "invariant"); |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4787
diff
changeset
|
103 } else { |
eff609af17d7
7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents:
4787
diff
changeset
|
104 if (during_initial_mark) { |
4787
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
105 // See the comment for note_start_of_copying() for the details |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
106 // on this. |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
107 assert(_next_top_at_mark_start == end(), "pre-condition"); |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
108 _next_top_at_mark_start = top(); |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
109 } else { |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
110 // See the comment for note_start_of_copying() for the details |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
111 // on this. |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
112 assert(top() >= _next_top_at_mark_start, "invariant"); |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
113 } |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
114 } |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
115 } |
2ace1c4ee8da
6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents:
2433
diff
changeset
|
116 |
1972 | 117 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_HEAPREGION_INLINE_HPP |