Mercurial > hg > graal-jvmci-8
annotate src/share/vm/memory/heap.hpp @ 3772:6747fd0512e0
7004681: G1: Extend marking verification to Full GCs
Summary: Perform a heap verification after the first phase of G1's full GC using objects' mark words to determine liveness. The third parameter of the heap verification routines, which was used in G1 to determine which marking bitmap to use in liveness calculations, has been changed from a boolean to an enum with values defined for using the mark word, and the 'prev' and 'next' bitmaps.
Reviewed-by: tonyp, ysr
author | johnc |
---|---|
date | Tue, 14 Jun 2011 11:01:10 -0700 |
parents | 51bd2d261853 |
children | d2a62e0f25eb |
rev | line source |
---|---|
0 | 1 /* |
1907 | 2 * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. |
0 | 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:
0
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
0
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:
0
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
1972 | 25 #ifndef SHARE_VM_MEMORY_HEAP_HPP |
26 #define SHARE_VM_MEMORY_HEAP_HPP | |
27 | |
28 #include "memory/allocation.hpp" | |
29 #include "runtime/virtualspace.hpp" | |
30 | |
0 | 31 // Blocks |
32 | |
33 class HeapBlock VALUE_OBJ_CLASS_SPEC { | |
34 friend class VMStructs; | |
35 | |
36 public: | |
37 struct Header { | |
38 size_t _length; // the length in segments | |
39 bool _used; // Used bit | |
40 }; | |
41 | |
42 protected: | |
43 union { | |
44 Header _header; | |
45 int64_t _padding[ (sizeof(Header) + sizeof(int64_t)-1) / sizeof(int64_t) ]; | |
46 // pad to 0 mod 8 | |
47 }; | |
48 | |
49 public: | |
50 // Initialization | |
51 void initialize(size_t length) { _header._length = length; set_used(); } | |
52 | |
53 // Accessors | |
54 void* allocated_space() const { return (void*)(this + 1); } | |
55 size_t length() const { return _header._length; } | |
56 | |
57 // Used/free | |
58 void set_used() { _header._used = true; } | |
59 void set_free() { _header._used = false; } | |
60 bool free() { return !_header._used; } | |
61 }; | |
62 | |
63 class FreeBlock: public HeapBlock { | |
64 friend class VMStructs; | |
65 protected: | |
66 FreeBlock* _link; | |
67 | |
68 public: | |
69 // Initialization | |
70 void initialize(size_t length) { HeapBlock::initialize(length); _link= NULL; } | |
71 | |
72 // Merging | |
73 void set_length(size_t l) { _header._length = l; } | |
74 | |
75 // Accessors | |
76 FreeBlock* link() const { return _link; } | |
77 void set_link(FreeBlock* link) { _link = link; } | |
78 }; | |
79 | |
80 class CodeHeap : public CHeapObj { | |
81 friend class VMStructs; | |
82 private: | |
83 VirtualSpace _memory; // the memory holding the blocks | |
84 VirtualSpace _segmap; // the memory holding the segment map | |
85 | |
86 size_t _number_of_committed_segments; | |
87 size_t _number_of_reserved_segments; | |
88 size_t _segment_size; | |
89 int _log2_segment_size; | |
90 | |
91 size_t _next_segment; | |
92 | |
93 FreeBlock* _freelist; | |
94 size_t _free_segments; // No. of segments in freelist | |
95 | |
96 // Helper functions | |
97 size_t number_of_segments(size_t size) const { return (size + _segment_size - 1) >> _log2_segment_size; } | |
98 size_t size(size_t number_of_segments) const { return number_of_segments << _log2_segment_size; } | |
99 | |
100 size_t segment_for(void* p) const { return ((char*)p - _memory.low()) >> _log2_segment_size; } | |
101 HeapBlock* block_at(size_t i) const { return (HeapBlock*)(_memory.low() + (i << _log2_segment_size)); } | |
102 | |
103 void mark_segmap_as_free(size_t beg, size_t end); | |
104 void mark_segmap_as_used(size_t beg, size_t end); | |
105 | |
106 // Freelist management helpers | |
107 FreeBlock* following_block(FreeBlock *b); | |
108 void insert_after(FreeBlock* a, FreeBlock* b); | |
109 void merge_right (FreeBlock* a); | |
110 | |
111 // Toplevel freelist management | |
112 void add_to_freelist(HeapBlock *b); | |
113 FreeBlock* search_freelist(size_t length); | |
114 | |
115 // Iteration helpers | |
116 void* next_free(HeapBlock* b) const; | |
117 HeapBlock* first_block() const; | |
118 HeapBlock* next_block(HeapBlock* b) const; | |
119 HeapBlock* block_start(void* p) const; | |
120 | |
121 // to perform additional actions on creation of executable code | |
122 void on_code_mapping(char* base, size_t size); | |
123 | |
124 public: | |
125 CodeHeap(); | |
126 | |
127 // Heap extents | |
128 bool reserve(size_t reserved_size, size_t committed_size, size_t segment_size); | |
129 void release(); // releases all allocated memory | |
130 bool expand_by(size_t size); // expands commited memory by size | |
131 void shrink_by(size_t size); // shrinks commited memory by size | |
132 void clear(); // clears all heap contents | |
133 | |
134 // Memory allocation | |
135 void* allocate (size_t size); // allocates a block of size or returns NULL | |
136 void deallocate(void* p); // deallocates a block | |
137 | |
138 // Attributes | |
139 void* begin() const { return _memory.low (); } | |
140 void* end() const { return _memory.high(); } | |
141 bool contains(void* p) const { return begin() <= p && p < end(); } | |
142 void* find_start(void* p) const; // returns the block containing p or NULL | |
143 size_t alignment_unit() const; // alignment of any block | |
144 size_t alignment_offset() const; // offset of first byte of any block, within the enclosing alignment unit | |
145 static size_t header_size(); // returns the header size for each heap block | |
146 | |
147 // Returns reserved area high and low addresses | |
148 char *low_boundary() const { return _memory.low_boundary (); } | |
1907 | 149 char *high() const { return _memory.high(); } |
0 | 150 char *high_boundary() const { return _memory.high_boundary(); } |
151 | |
152 // Iteration | |
153 | |
154 // returns the first block or NULL | |
155 void* first() const { return next_free(first_block()); } | |
156 // returns the next block given a block p or NULL | |
157 void* next(void* p) const { return next_free(next_block(block_start(p))); } | |
158 | |
159 // Statistics | |
160 size_t capacity() const; | |
161 size_t max_capacity() const; | |
162 size_t allocated_capacity() const; | |
163 size_t unallocated_capacity() const { return max_capacity() - allocated_capacity(); } | |
2091
51bd2d261853
7008325: CodeCache exhausted on sparc starting from hs20b04
kvn
parents:
1972
diff
changeset
|
164 size_t largest_free_block() const; |
0 | 165 |
166 // Debugging | |
167 void verify(); | |
168 void print() PRODUCT_RETURN; | |
169 }; | |
1972 | 170 |
171 #endif // SHARE_VM_MEMORY_HEAP_HPP |