annotate src/share/vm/gc_implementation/concurrentMarkSweep/freeChunk.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 685df3c6f84b
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
187
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
1 /*
6842
b9a9ed0f8eeb 7197424: update copyright year to match last edit in jdk8 hotspot repository
mikael
parents: 6028
diff changeset
2 * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
187
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
4 *
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
7 * published by the Free Software Foundation.
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
8 *
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
13 * accompanied this code).
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
14 *
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1145
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1145
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: 1145
diff changeset
21 * questions.
187
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
22 *
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
23 */
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1716
diff changeset
25 #ifndef SHARE_VM_GC_IMPLEMENTATION_CONCURRENTMARKSWEEP_FREECHUNK_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1716
diff changeset
26 #define SHARE_VM_GC_IMPLEMENTATION_CONCURRENTMARKSWEEP_FREECHUNK_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1716
diff changeset
27
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1716
diff changeset
28 #include "memory/allocation.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1716
diff changeset
29 #include "memory/memRegion.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1716
diff changeset
30 #include "oops/markOop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1716
diff changeset
31 #include "runtime/mutex.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1716
diff changeset
32 #include "utilities/debug.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1716
diff changeset
33 #include "utilities/globalDefinitions.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1716
diff changeset
34 #include "utilities/ostream.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1716
diff changeset
35
187
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
36 //
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
37 // Free block maintenance for Concurrent Mark Sweep Generation
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
38 //
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
39 // The main data structure for free blocks are
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
40 // . an indexed array of small free blocks, and
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
41 // . a dictionary of large free blocks
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
42 //
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
43
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
44 // No virtuals in FreeChunk (don't want any vtables).
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
45
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
46 // A FreeChunk is merely a chunk that can be in a doubly linked list
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
47 // and has a size field. NOTE: FreeChunks are distinguished from allocated
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
48 // objects in two ways (by the sweeper), depending on whether the VM is 32 or
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
49 // 64 bits.
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
50 // In 32 bits or 64 bits without CompressedOops, the second word (prev) has the
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
51 // LSB set to indicate a free chunk; allocated objects' klass() pointers
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
52 // don't have their LSB set. The corresponding bit in the CMSBitMap is
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
53 // set when the chunk is allocated. There are also blocks that "look free"
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
54 // but are not part of the free list and should not be coalesced into larger
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
55 // free blocks. These free blocks have their two LSB's set.
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
56
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
57 class FreeChunk VALUE_OBJ_CLASS_SPEC {
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
58 friend class VMStructs;
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
59 // For 64 bit compressed oops, the markOop encodes both the size and the
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
60 // indication that this is a FreeChunk and not an object.
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
61 volatile size_t _size;
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
62 FreeChunk* _prev;
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
63 FreeChunk* _next;
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
64
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
65 markOop mark() const volatile { return (markOop)_size; }
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
66 void set_mark(markOop m) { _size = (size_t)m; }
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
67
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
68 public:
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
69 NOT_PRODUCT(static const size_t header_size();)
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
70
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
71 // Returns "true" if the address indicates that the block represents
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
72 // a free chunk.
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
73 static bool indicatesFreeChunk(const HeapWord* addr) {
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
74 // Force volatile read from addr because value might change between
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
75 // calls. We really want the read of _mark and _prev from this pointer
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
76 // to be volatile but making the fields volatile causes all sorts of
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
77 // compilation errors.
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 3761
diff changeset
78 return ((volatile FreeChunk*)addr)->is_free();
187
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
79 }
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
80
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 3761
diff changeset
81 bool is_free() const volatile {
187
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
82 LP64_ONLY(if (UseCompressedOops) return mark()->is_cms_free_chunk(); else)
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
83 return (((intptr_t)_prev) & 0x1) == 0x1;
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
84 }
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
85 bool cantCoalesce() const {
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 3761
diff changeset
86 assert(is_free(), "can't get coalesce bit on not free");
187
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
87 return (((intptr_t)_prev) & 0x2) == 0x2;
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
88 }
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
89 void dontCoalesce() {
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
90 // the block should be free
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 3761
diff changeset
91 assert(is_free(), "Should look like a free block");
187
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
92 _prev = (FreeChunk*)(((intptr_t)_prev) | 0x2);
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
93 }
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
94 FreeChunk* prev() const {
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
95 return (FreeChunk*)(((intptr_t)_prev) & ~(0x3));
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
96 }
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
97
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
98 debug_only(void* prev_addr() const { return (void*)&_prev; })
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 187
diff changeset
99 debug_only(void* next_addr() const { return (void*)&_next; })
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 187
diff changeset
100 debug_only(void* size_addr() const { return (void*)&_size; })
187
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
101
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
102 size_t size() const volatile {
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
103 LP64_ONLY(if (UseCompressedOops) return mark()->get_size(); else )
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
104 return _size;
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
105 }
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 3761
diff changeset
106 void set_size(size_t sz) {
187
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
107 LP64_ONLY(if (UseCompressedOops) set_mark(markOopDesc::set_size_and_free(sz)); else )
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
108 _size = sz;
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
109 }
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
110
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
111 FreeChunk* next() const { return _next; }
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
112
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 3761
diff changeset
113 void link_after(FreeChunk* ptr) {
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 3761
diff changeset
114 link_next(ptr);
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 3761
diff changeset
115 if (ptr != NULL) ptr->link_prev(this);
187
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
116 }
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 3761
diff changeset
117 void link_next(FreeChunk* ptr) { _next = ptr; }
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 3761
diff changeset
118 void link_prev(FreeChunk* ptr) {
1716
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
119 LP64_ONLY(if (UseCompressedOops) _prev = ptr; else)
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
120 _prev = (FreeChunk*)((intptr_t)ptr | 0x1);
187
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
121 }
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 3761
diff changeset
122 void clear_next() { _next = NULL; }
187
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
123 void markNotFree() {
1716
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
124 // Set _prev (klass) to null before (if) clearing the mark word below
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
125 _prev = NULL;
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
126 #ifdef _LP64
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
127 if (UseCompressedOops) {
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
128 OrderAccess::storestore();
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
129 set_mark(markOopDesc::prototype());
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
130 }
be3f9c242c9d 6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
ysr
parents: 1579
diff changeset
131 #endif
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 3761
diff changeset
132 assert(!is_free(), "Error");
187
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
133 }
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
134
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
135 // Return the address past the end of this chunk
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6842
diff changeset
136 uintptr_t* end() const { return ((uintptr_t*) this) + size(); }
187
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
137
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
138 // debugging
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
139 void verify() const PRODUCT_RETURN;
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
140 void verifyList() const PRODUCT_RETURN;
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
141 void mangleAllocated(size_t size) PRODUCT_RETURN;
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
142 void mangleFreed(size_t size) PRODUCT_RETURN;
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
143
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
144 void print_on(outputStream* st);
187
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
145 };
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
146
1571
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1145
diff changeset
147 extern size_t MinChunkSize;
187
790e66e5fbac 6687581: Make CMS work with compressed oops
coleenp
parents:
diff changeset
148
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1716
diff changeset
149
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1716
diff changeset
150 #endif // SHARE_VM_GC_IMPLEMENTATION_CONCURRENTMARKSWEEP_FREECHUNK_HPP