1 /*
2 * Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved.
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 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #ifndef SHARE_VM_GC_PARALLEL_PARALLELSCAVENGEHEAP_HPP
26 #define SHARE_VM_GC_PARALLEL_PARALLELSCAVENGEHEAP_HPP
27
28 #include "gc/parallel/generationSizer.hpp"
29 #include "gc/parallel/objectStartArray.hpp"
30 #include "gc/parallel/psGCAdaptivePolicyCounters.hpp"
31 #include "gc/parallel/psOldGen.hpp"
32 #include "gc/parallel/psYoungGen.hpp"
33 #include "gc/shared/collectedHeap.hpp"
34 #include "gc/shared/collectorPolicy.hpp"
35 #include "gc/shared/gcPolicyCounters.hpp"
36 #include "gc/shared/gcWhen.hpp"
37 #include "gc/shared/strongRootsScope.hpp"
38 #include "memory/metaspace.hpp"
39 #include "utilities/ostream.hpp"
40
41 class AdjoiningGenerations;
42 class GCHeapSummary;
43 class GCTaskManager;
44 class PSAdaptiveSizePolicy;
45 class PSHeapSummary;
46
47 class ParallelScavengeHeap : public CollectedHeap {
48 friend class VMStructs;
49 private:
50 static PSYoungGen* _young_gen;
51 static PSOldGen* _old_gen;
52
53 // Sizing policy for entire heap
54 static PSAdaptiveSizePolicy* _size_policy;
55 static PSGCAdaptivePolicyCounters* _gc_policy_counters;
56
57 GenerationSizer* _collector_policy;
58
59 // Collection of generations that are adjacent in the
60 // space reserved for the heap.
61 AdjoiningGenerations* _gens;
62 unsigned int _death_march_count;
63
64 // The task manager
65 static GCTaskManager* _gc_task_manager;
66
67 void trace_heap(GCWhen::Type when, const GCTracer* tracer);
68
69 protected:
70 static inline size_t total_invocations();
71 HeapWord* allocate_new_tlab(size_t size);
72
73 inline bool should_alloc_in_eden(size_t size) const;
74 inline void death_march_check(HeapWord* const result, size_t size);
75 HeapWord* mem_allocate_old_gen(size_t size);
76
77 public:
78 ParallelScavengeHeap(GenerationSizer* policy) :
79 CollectedHeap(), _collector_policy(policy), _death_march_count(0) { }
80
81 // For use by VM operations
82 enum CollectionType {
83 Scavenge,
84 MarkSweep
85 };
86
87 virtual Name kind() const {
88 return CollectedHeap::ParallelScavengeHeap;
89 }
90
91 virtual const char* name() const {
92 return "Parallel";
93 }
94
95 virtual CollectorPolicy* collector_policy() const { return _collector_policy; }
96
97 static PSYoungGen* young_gen() { return _young_gen; }
98 static PSOldGen* old_gen() { return _old_gen; }
99
100 virtual PSAdaptiveSizePolicy* size_policy() { return _size_policy; }
101
102 static PSGCAdaptivePolicyCounters* gc_policy_counters() { return _gc_policy_counters; }
103
104 static ParallelScavengeHeap* heap();
105
106 static GCTaskManager* const gc_task_manager() { return _gc_task_manager; }
107
108 AdjoiningGenerations* gens() { return _gens; }
109
110 // Returns JNI_OK on success
111 virtual jint initialize();
112
113 void post_initialize();
114 void update_counters();
115
116 // The alignment used for the various areas
227 // Resize the young generation. The reserved space for the
228 // generation may be expanded in preparation for the resize.
229 void resize_young_gen(size_t eden_size, size_t survivor_size);
230
231 // Resize the old generation. The reserved space for the
232 // generation may be expanded in preparation for the resize.
233 void resize_old_gen(size_t desired_free_space);
234
235 // Save the tops of the spaces in all generations
236 void record_gen_tops_before_GC() PRODUCT_RETURN;
237
238 // Mangle the unused parts of all spaces in the heap
239 void gen_mangle_unused_area() PRODUCT_RETURN;
240
241 // Call these in sequential code around the processing of strong roots.
242 class ParStrongRootsScope : public MarkScope {
243 public:
244 ParStrongRootsScope();
245 ~ParStrongRootsScope();
246 };
247 };
248
249 // Simple class for storing info about the heap at the start of GC, to be used
250 // after GC for comparison/printing.
251 class PreGCValues {
252 public:
253 PreGCValues(ParallelScavengeHeap* heap) :
254 _heap_used(heap->used()),
255 _young_gen_used(heap->young_gen()->used_in_bytes()),
256 _old_gen_used(heap->old_gen()->used_in_bytes()),
257 _metadata_used(MetaspaceAux::used_bytes()) { };
258
259 size_t heap_used() const { return _heap_used; }
260 size_t young_gen_used() const { return _young_gen_used; }
261 size_t old_gen_used() const { return _old_gen_used; }
262 size_t metadata_used() const { return _metadata_used; }
263
264 private:
265 size_t _heap_used;
266 size_t _young_gen_used;
|
1 /*
2 * Copyright (c) 2001, 2017, Oracle and/or its affiliates. All rights reserved.
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 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #ifndef SHARE_VM_GC_PARALLEL_PARALLELSCAVENGEHEAP_HPP
26 #define SHARE_VM_GC_PARALLEL_PARALLELSCAVENGEHEAP_HPP
27
28 #include "gc/parallel/generationSizer.hpp"
29 #include "gc/parallel/objectStartArray.hpp"
30 #include "gc/parallel/psGCAdaptivePolicyCounters.hpp"
31 #include "gc/parallel/psOldGen.hpp"
32 #include "gc/parallel/psYoungGen.hpp"
33 #include "gc/shared/collectedHeap.hpp"
34 #include "gc/shared/collectorPolicy.hpp"
35 #include "gc/shared/gcPolicyCounters.hpp"
36 #include "gc/shared/gcWhen.hpp"
37 #include "gc/shared/strongRootsScope.hpp"
38 #include "memory/metaspace.hpp"
39 #include "utilities/growableArray.hpp"
40 #include "utilities/ostream.hpp"
41
42 class AdjoiningGenerations;
43 class GCHeapSummary;
44 class GCTaskManager;
45 class MemoryManager;
46 class MemoryPool;
47 class PSAdaptiveSizePolicy;
48 class PSHeapSummary;
49
50 class ParallelScavengeHeap : public CollectedHeap {
51 friend class VMStructs;
52 private:
53 static PSYoungGen* _young_gen;
54 static PSOldGen* _old_gen;
55
56 // Sizing policy for entire heap
57 static PSAdaptiveSizePolicy* _size_policy;
58 static PSGCAdaptivePolicyCounters* _gc_policy_counters;
59
60 GenerationSizer* _collector_policy;
61
62 // Collection of generations that are adjacent in the
63 // space reserved for the heap.
64 AdjoiningGenerations* _gens;
65 unsigned int _death_march_count;
66
67 // The task manager
68 static GCTaskManager* _gc_task_manager;
69
70 GCMemoryManager* _young_manager;
71 GCMemoryManager* _old_manager;
72
73 MemoryPool* _eden_pool;
74 MemoryPool* _survivor_pool;
75 MemoryPool* _old_pool;
76
77 virtual void initialize_serviceability();
78
79 void trace_heap(GCWhen::Type when, const GCTracer* tracer);
80
81 protected:
82 static inline size_t total_invocations();
83 HeapWord* allocate_new_tlab(size_t size);
84
85 inline bool should_alloc_in_eden(size_t size) const;
86 inline void death_march_check(HeapWord* const result, size_t size);
87 HeapWord* mem_allocate_old_gen(size_t size);
88
89 public:
90 ParallelScavengeHeap(GenerationSizer* policy) :
91 CollectedHeap(), _collector_policy(policy), _death_march_count(0) { }
92
93 // For use by VM operations
94 enum CollectionType {
95 Scavenge,
96 MarkSweep
97 };
98
99 virtual Name kind() const {
100 return CollectedHeap::ParallelScavengeHeap;
101 }
102
103 virtual const char* name() const {
104 return "Parallel";
105 }
106
107 virtual CollectorPolicy* collector_policy() const { return _collector_policy; }
108
109 virtual GrowableArray<GCMemoryManager*> memory_managers();
110 virtual GrowableArray<MemoryPool*> memory_pools();
111
112 static PSYoungGen* young_gen() { return _young_gen; }
113 static PSOldGen* old_gen() { return _old_gen; }
114
115 virtual PSAdaptiveSizePolicy* size_policy() { return _size_policy; }
116
117 static PSGCAdaptivePolicyCounters* gc_policy_counters() { return _gc_policy_counters; }
118
119 static ParallelScavengeHeap* heap();
120
121 static GCTaskManager* const gc_task_manager() { return _gc_task_manager; }
122
123 AdjoiningGenerations* gens() { return _gens; }
124
125 // Returns JNI_OK on success
126 virtual jint initialize();
127
128 void post_initialize();
129 void update_counters();
130
131 // The alignment used for the various areas
242 // Resize the young generation. The reserved space for the
243 // generation may be expanded in preparation for the resize.
244 void resize_young_gen(size_t eden_size, size_t survivor_size);
245
246 // Resize the old generation. The reserved space for the
247 // generation may be expanded in preparation for the resize.
248 void resize_old_gen(size_t desired_free_space);
249
250 // Save the tops of the spaces in all generations
251 void record_gen_tops_before_GC() PRODUCT_RETURN;
252
253 // Mangle the unused parts of all spaces in the heap
254 void gen_mangle_unused_area() PRODUCT_RETURN;
255
256 // Call these in sequential code around the processing of strong roots.
257 class ParStrongRootsScope : public MarkScope {
258 public:
259 ParStrongRootsScope();
260 ~ParStrongRootsScope();
261 };
262
263 GCMemoryManager* old_gc_manager() const { return _old_manager; }
264 GCMemoryManager* young_gc_manager() const { return _young_manager; }
265 };
266
267 // Simple class for storing info about the heap at the start of GC, to be used
268 // after GC for comparison/printing.
269 class PreGCValues {
270 public:
271 PreGCValues(ParallelScavengeHeap* heap) :
272 _heap_used(heap->used()),
273 _young_gen_used(heap->young_gen()->used_in_bytes()),
274 _old_gen_used(heap->old_gen()->used_in_bytes()),
275 _metadata_used(MetaspaceAux::used_bytes()) { };
276
277 size_t heap_used() const { return _heap_used; }
278 size_t young_gen_used() const { return _young_gen_used; }
279 size_t old_gen_used() const { return _old_gen_used; }
280 size_t metadata_used() const { return _metadata_used; }
281
282 private:
283 size_t _heap_used;
284 size_t _young_gen_used;
|