comparison src/share/vm/memory/sharedHeap.hpp @ 6725:da91efe96a93

6964458: Reimplement class meta-data storage to use native memory Summary: Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland Contributed-by: jmasa <jon.masamitsu@oracle.com>, stefank <stefan.karlsson@oracle.com>, mgerdin <mikael.gerdin@oracle.com>, never <tom.rodriguez@oracle.com>
author coleenp
date Sat, 01 Sep 2012 13:25:18 -0400
parents 441e946dc1af
children a08c80e9e1e5
comparison
equal deleted inserted replaced
6724:36d1d483d5d6 6725:da91efe96a93
1 /* 1 /*
2 * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. 2 * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 * 4 *
5 * This code is free software; you can redistribute it and/or modify it 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 6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
25 #ifndef SHARE_VM_MEMORY_SHAREDHEAP_HPP 25 #ifndef SHARE_VM_MEMORY_SHAREDHEAP_HPP
26 #define SHARE_VM_MEMORY_SHAREDHEAP_HPP 26 #define SHARE_VM_MEMORY_SHAREDHEAP_HPP
27 27
28 #include "gc_interface/collectedHeap.hpp" 28 #include "gc_interface/collectedHeap.hpp"
29 #include "memory/generation.hpp" 29 #include "memory/generation.hpp"
30 #include "memory/permGen.hpp"
31 30
32 // A "SharedHeap" is an implementation of a java heap for HotSpot. This 31 // A "SharedHeap" is an implementation of a java heap for HotSpot. This
33 // is an abstract class: there may be many different kinds of heaps. This 32 // is an abstract class: there may be many different kinds of heaps. This
34 // class defines the functions that a heap must implement, and contains 33 // class defines the functions that a heap must implement, and contains
35 // infrastructure common to all heaps. 34 // infrastructure common to all heaps.
36 35
37 class PermGen;
38 class Generation; 36 class Generation;
39 class BarrierSet; 37 class BarrierSet;
40 class GenRemSet; 38 class GenRemSet;
41 class Space; 39 class Space;
42 class SpaceClosure; 40 class SpaceClosure;
45 class ObjectClosure; 43 class ObjectClosure;
46 class SubTasksDone; 44 class SubTasksDone;
47 class WorkGang; 45 class WorkGang;
48 class FlexibleWorkGang; 46 class FlexibleWorkGang;
49 class CollectorPolicy; 47 class CollectorPolicy;
50 class KlassHandle; 48 class KlassClosure;
51 49
52 // Note on use of FlexibleWorkGang's for GC. 50 // Note on use of FlexibleWorkGang's for GC.
53 // There are three places where task completion is determined. 51 // There are three places where task completion is determined.
54 // In 52 // In
55 // 1) ParallelTaskTerminator::offer_termination() where _n_threads 53 // 1) ParallelTaskTerminator::offer_termination() where _n_threads
71 // number of active GC workers. CompactibleFreeListSpace and Space 69 // number of active GC workers. CompactibleFreeListSpace and Space
72 // have SequentialSubTasksDone's. 70 // have SequentialSubTasksDone's.
73 // Example of using SubTasksDone and SequentialSubTasksDone 71 // Example of using SubTasksDone and SequentialSubTasksDone
74 // G1CollectedHeap::g1_process_strong_roots() calls 72 // G1CollectedHeap::g1_process_strong_roots() calls
75 // process_strong_roots(false, // no scoping; this is parallel code 73 // process_strong_roots(false, // no scoping; this is parallel code
76 // collecting_perm_gen, so, 74 // is_scavenging, so,
77 // &buf_scan_non_heap_roots, 75 // &buf_scan_non_heap_roots,
78 // &eager_scan_code_roots, 76 // &eager_scan_code_roots);
79 // &buf_scan_perm);
80 // which delegates to SharedHeap::process_strong_roots() and uses 77 // which delegates to SharedHeap::process_strong_roots() and uses
81 // SubTasksDone* _process_strong_tasks to claim tasks. 78 // SubTasksDone* _process_strong_tasks to claim tasks.
82 // process_strong_roots() calls 79 // process_strong_roots() calls
83 // rem_set()->younger_refs_iterate(perm_gen(), perm_blk); 80 // rem_set()->younger_refs_iterate()
84 // to scan the card table and which eventually calls down into 81 // to scan the card table and which eventually calls down into
85 // CardTableModRefBS::par_non_clean_card_iterate_work(). This method 82 // CardTableModRefBS::par_non_clean_card_iterate_work(). This method
86 // uses SequentialSubTasksDone* _pst to claim tasks. 83 // uses SequentialSubTasksDone* _pst to claim tasks.
87 // Both SubTasksDone and SequentialSubTasksDone call their method 84 // Both SubTasksDone and SequentialSubTasksDone call their method
88 // all_tasks_completed() to count the number of GC workers that have 85 // all_tasks_completed() to count the number of GC workers that have
119 // There should be only a single instance of "SharedHeap" in a program. 116 // There should be only a single instance of "SharedHeap" in a program.
120 // This is enforced with the protected constructor below, which will also 117 // This is enforced with the protected constructor below, which will also
121 // set the static pointer "_sh" to that instance. 118 // set the static pointer "_sh" to that instance.
122 static SharedHeap* _sh; 119 static SharedHeap* _sh;
123 120
124 // All heaps contain a "permanent generation." This is some ways
125 // similar to a generation in a generational system, in other ways not.
126 // See the "PermGen" class.
127 PermGen* _perm_gen;
128
129 // and the Gen Remembered Set, at least one good enough to scan the perm 121 // and the Gen Remembered Set, at least one good enough to scan the perm
130 // gen. 122 // gen.
131 GenRemSet* _rem_set; 123 GenRemSet* _rem_set;
132 124
133 // A gc policy, controls global gc resource issues 125 // A gc policy, controls global gc resource issues
153 bool _thread_holds_heap_lock_for_gc; 145 bool _thread_holds_heap_lock_for_gc;
154 146
155 public: 147 public:
156 static SharedHeap* heap() { return _sh; } 148 static SharedHeap* heap() { return _sh; }
157 149
158 CollectorPolicy *collector_policy() const { return _collector_policy; }
159
160 void set_barrier_set(BarrierSet* bs); 150 void set_barrier_set(BarrierSet* bs);
161 SubTasksDone* process_strong_tasks() { return _process_strong_tasks; } 151 SubTasksDone* process_strong_tasks() { return _process_strong_tasks; }
162 152
163 // Does operations required after initialization has been done. 153 // Does operations required after initialization has been done.
164 virtual void post_initialize(); 154 virtual void post_initialize();
165 155
166 // Initialization of ("weak") reference processing support 156 // Initialization of ("weak") reference processing support
167 virtual void ref_processing_init(); 157 virtual void ref_processing_init();
168 158
169 void set_perm(PermGen* perm_gen) { _perm_gen = perm_gen; }
170
171 // This function returns the "GenRemSet" object that allows us to scan 159 // This function returns the "GenRemSet" object that allows us to scan
172 // generations; at least the perm gen, possibly more in a fully 160 // generations in a fully generational heap.
173 // generational heap.
174 GenRemSet* rem_set() { return _rem_set; } 161 GenRemSet* rem_set() { return _rem_set; }
175 162
176 // These function return the "permanent" generation, in which
177 // reflective objects are allocated and stored. Two versions, the second
178 // of which returns the view of the perm gen as a generation.
179 PermGen* perm() const { return _perm_gen; }
180 Generation* perm_gen() const { return _perm_gen->as_gen(); }
181
182 // Iteration functions. 163 // Iteration functions.
183 void oop_iterate(OopClosure* cl) = 0; 164 void oop_iterate(ExtendedOopClosure* cl) = 0;
184 165
185 // Same as above, restricted to a memory region. 166 // Same as above, restricted to a memory region.
186 virtual void oop_iterate(MemRegion mr, OopClosure* cl) = 0; 167 virtual void oop_iterate(MemRegion mr, ExtendedOopClosure* cl) = 0;
187 168
188 // Iterate over all objects allocated since the last collection, calling 169 // Iterate over all objects allocated since the last collection, calling
189 // "cl->do_object" on each. The heap must have been initialized properly 170 // "cl->do_object" on each. The heap must have been initialized properly
190 // to support this function, or else this call will fail. 171 // to support this function, or else this call will fail.
191 virtual void object_iterate_since_last_GC(ObjectClosure* cl) = 0; 172 virtual void object_iterate_since_last_GC(ObjectClosure* cl) = 0;
249 }; 230 };
250 231
251 FlexibleWorkGang* workers() const { return _workers; } 232 FlexibleWorkGang* workers() const { return _workers; }
252 233
253 // Invoke the "do_oop" method the closure "roots" on all root locations. 234 // Invoke the "do_oop" method the closure "roots" on all root locations.
254 // If "collecting_perm_gen" is false, then roots that may only contain 235 // The "so" argument determines which roots the closure is applied to:
255 // references to permGen objects are not scanned; instead, in that case,
256 // the "perm_blk" closure is applied to all outgoing refs in the
257 // permanent generation. The "so" argument determines which of roots
258 // the closure is applied to:
259 // "SO_None" does none; 236 // "SO_None" does none;
260 // "SO_AllClasses" applies the closure to all entries in the SystemDictionary; 237 // "SO_AllClasses" applies the closure to all entries in the SystemDictionary;
261 // "SO_SystemClasses" to all the "system" classes and loaders; 238 // "SO_SystemClasses" to all the "system" classes and loaders;
262 // "SO_Strings" applies the closure to all entries in StringTable; 239 // "SO_Strings" applies the closure to all entries in StringTable;
263 // "SO_CodeCache" applies the closure to all elements of the CodeCache. 240 // "SO_CodeCache" applies the closure to all elements of the CodeCache.
264 void process_strong_roots(bool activate_scope, 241 void process_strong_roots(bool activate_scope,
265 bool collecting_perm_gen, 242 bool is_scavenging,
266 ScanningOption so, 243 ScanningOption so,
267 OopClosure* roots, 244 OopClosure* roots,
268 CodeBlobClosure* code_roots, 245 CodeBlobClosure* code_roots,
269 OopsInGenClosure* perm_blk); 246 KlassClosure* klass_closure);
270 247
271 // Apply "blk" to all the weak roots of the system. These include 248 // Apply "blk" to all the weak roots of the system. These include
272 // JNI weak roots, the code cache, system dictionary, symbol table, 249 // JNI weak roots, the code cache, system dictionary, symbol table,
273 // string table. 250 // string table.
274 void process_weak_roots(OopClosure* root_closure, 251 void process_weak_roots(OopClosure* root_closure,
294 271
295 // 272 //
296 // New methods from CollectedHeap 273 // New methods from CollectedHeap
297 // 274 //
298 275
299 size_t permanent_capacity() const {
300 assert(perm_gen(), "NULL perm gen");
301 return perm_gen()->capacity();
302 }
303
304 size_t permanent_used() const {
305 assert(perm_gen(), "NULL perm gen");
306 return perm_gen()->used();
307 }
308
309 bool is_in_permanent(const void *p) const {
310 assert(perm_gen(), "NULL perm gen");
311 return perm_gen()->is_in_reserved(p);
312 }
313
314 // Different from is_in_permanent in that is_in_permanent
315 // only checks if p is in the reserved area of the heap
316 // and this checks to see if it in the commited area.
317 // This is typically used by things like the forte stackwalker
318 // during verification of suspicious frame values.
319 bool is_permanent(const void *p) const {
320 assert(perm_gen(), "NULL perm gen");
321 return perm_gen()->is_in(p);
322 }
323
324 HeapWord* permanent_mem_allocate(size_t size) {
325 assert(perm_gen(), "NULL perm gen");
326 return _perm_gen->mem_allocate(size);
327 }
328
329 void permanent_oop_iterate(OopClosure* cl) {
330 assert(perm_gen(), "NULL perm gen");
331 _perm_gen->oop_iterate(cl);
332 }
333
334 void permanent_object_iterate(ObjectClosure* cl) {
335 assert(perm_gen(), "NULL perm gen");
336 _perm_gen->object_iterate(cl);
337 }
338
339 // Some utilities. 276 // Some utilities.
340 void print_size_transition(outputStream* out, 277 void print_size_transition(outputStream* out,
341 size_t bytes_before, 278 size_t bytes_before,
342 size_t bytes_after, 279 size_t bytes_after,
343 size_t capacity); 280 size_t capacity);