34 #include "gc/shared/strongRootsScope.hpp"
35 #include "gc/shared/workgroup.hpp"
36 #include "oops/oop.inline.hpp"
37 #include "runtime/vmThread.hpp"
38 #include "services/memoryManager.hpp"
39 #include "utilities/stack.inline.hpp"
40
41 class CompactibleFreeListSpacePool : public CollectedMemoryPool {
42 private:
43 CompactibleFreeListSpace* _space;
44 public:
45 CompactibleFreeListSpacePool(CompactibleFreeListSpace* space,
46 const char* name,
47 size_t max_size,
48 bool support_usage_threshold) :
49 CollectedMemoryPool(name, space->capacity(), max_size, support_usage_threshold),
50 _space(space) {
51 }
52
53 MemoryUsage get_memory_usage() {
54 size_t maxSize = (available_for_allocation() ? max_size() : 0);
55 size_t used = used_in_bytes();
56 size_t committed = _space->capacity();
57
58 return MemoryUsage(initial_size(), used, committed, maxSize);
59 }
60
61 size_t used_in_bytes() {
62 return _space->used();
63 }
64 };
65
66 CMSHeap::CMSHeap(GenCollectorPolicy *policy) :
67 GenCollectedHeap(policy), _eden_pool(NULL), _survivor_pool(NULL), _old_pool(NULL) {
68 _young_mgr = new GCMemoryManager("ParNew", "end of minor GC");
69 _old_mgr = new GCMemoryManager("ConcurrentMarkSweep", "end of major GC");
70
71 _workers = new WorkGang("GC Thread", ParallelGCThreads,
72 /* are_GC_task_threads */true,
73 /* are_ConcurrentGC_threads */false);
74 _workers->initialize_workers();
75 }
76
77 jint CMSHeap::initialize() {
78 jint status = GenCollectedHeap::initialize();
79 if (status != JNI_OK) return status;
80
81 // If we are running CMS, create the collector responsible
82 // for collecting the CMS generations.
83 assert(collector_policy()->is_concurrent_mark_sweep_policy(), "must be CMS policy");
84 if (!create_cms_collector()) {
85 return JNI_ENOMEM;
86 }
87
88 ParNewGeneration* young = (ParNewGeneration*) young_gen();
89 _eden_pool = new ContiguousSpacePool(young->eden(),
90 "Par Eden Space",
91 young->max_eden_size(),
92 false);
93
94 _survivor_pool = new SurvivorContiguousSpacePool(young,
95 "Par Survivor Space",
96 young->max_survivor_size(),
97 false);
98
99 ConcurrentMarkSweepGeneration* old = (ConcurrentMarkSweepGeneration*) old_gen();
100 _old_pool = new CompactibleFreeListSpacePool(old->cmsSpace(),
101 "CMS Old Gen",
102 old->reserved().byte_size(),
103 true);
104
105 _young_mgr->add_pool(_eden_pool);
106 _young_mgr->add_pool(_survivor_pool);
107
108 _old_mgr->add_pool(_eden_pool);
109 _old_mgr->add_pool(_survivor_pool);
110 _old_mgr->add_pool(_old_pool);
111
112 return JNI_OK;
113 }
114
115 void CMSHeap::check_gen_kinds() {
116 assert(young_gen()->kind() == Generation::ParNew,
117 "Wrong youngest generation type");
118 assert(old_gen()->kind() == Generation::ConcurrentMarkSweep,
119 "Wrong generation kind");
120 }
121
122 CMSHeap* CMSHeap::heap() {
123 CollectedHeap* heap = Universe::heap();
124 assert(heap != NULL, "Uninitialized access to CMSHeap::heap()");
125 assert(heap->kind() == CollectedHeap::CMSHeap, "Not a CMSHeap");
126 return (CMSHeap*) heap;
127 }
128
129 void CMSHeap::gc_threads_do(ThreadClosure* tc) const {
130 assert(workers() != NULL, "should have workers here");
227 root_closure->set_generation(young_gen());
228 young_gen()->oop_iterate(root_closure);
229 root_closure->reset_generation();
230 }
231
232 _process_strong_tasks->all_tasks_completed(scope->n_threads());
233 }
234
235 void CMSHeap::gc_prologue(bool full) {
236 always_do_update_barrier = false;
237 GenCollectedHeap::gc_prologue(full);
238 };
239
240 void CMSHeap::gc_epilogue(bool full) {
241 GenCollectedHeap::gc_epilogue(full);
242 always_do_update_barrier = true;
243 };
244
245 GrowableArray<GCMemoryManager*> CMSHeap::memory_managers() {
246 GrowableArray<GCMemoryManager*> memory_managers(2);
247 memory_managers.append(_young_mgr);
248 memory_managers.append(_old_mgr);
249 return memory_managers;
250 }
251
252 GrowableArray<MemoryPool*> CMSHeap::memory_pools() {
253 GrowableArray<MemoryPool*> memory_pools(3);
254 memory_pools.append(_eden_pool);
255 memory_pools.append(_survivor_pool);
256 memory_pools.append(_old_pool);
257 return memory_pools;
258 }
|
34 #include "gc/shared/strongRootsScope.hpp"
35 #include "gc/shared/workgroup.hpp"
36 #include "oops/oop.inline.hpp"
37 #include "runtime/vmThread.hpp"
38 #include "services/memoryManager.hpp"
39 #include "utilities/stack.inline.hpp"
40
41 class CompactibleFreeListSpacePool : public CollectedMemoryPool {
42 private:
43 CompactibleFreeListSpace* _space;
44 public:
45 CompactibleFreeListSpacePool(CompactibleFreeListSpace* space,
46 const char* name,
47 size_t max_size,
48 bool support_usage_threshold) :
49 CollectedMemoryPool(name, space->capacity(), max_size, support_usage_threshold),
50 _space(space) {
51 }
52
53 MemoryUsage get_memory_usage() {
54 size_t max_heap_size = (available_for_allocation() ? max_size() : 0);
55 size_t used = used_in_bytes();
56 size_t committed = _space->capacity();
57
58 return MemoryUsage(initial_size(), used, committed, max_heap_size);
59 }
60
61 size_t used_in_bytes() {
62 return _space->used();
63 }
64 };
65
66 CMSHeap::CMSHeap(GenCollectorPolicy *policy) :
67 GenCollectedHeap(policy), _eden_pool(NULL), _survivor_pool(NULL), _old_pool(NULL) {
68 _young_manager = new GCMemoryManager("ParNew", "end of minor GC");
69 _old_manager = new GCMemoryManager("ConcurrentMarkSweep", "end of major GC");
70
71 _workers = new WorkGang("GC Thread", ParallelGCThreads,
72 /* are_GC_task_threads */true,
73 /* are_ConcurrentGC_threads */false);
74 _workers->initialize_workers();
75 }
76
77 jint CMSHeap::initialize() {
78 jint status = GenCollectedHeap::initialize();
79 if (status != JNI_OK) return status;
80
81 // If we are running CMS, create the collector responsible
82 // for collecting the CMS generations.
83 assert(collector_policy()->is_concurrent_mark_sweep_policy(), "must be CMS policy");
84 if (!create_cms_collector()) {
85 return JNI_ENOMEM;
86 }
87
88 ParNewGeneration* young = (ParNewGeneration*) young_gen();
89 _eden_pool = new ContiguousSpacePool(young->eden(),
90 "Par Eden Space",
91 young->max_eden_size(),
92 false);
93
94 _survivor_pool = new SurvivorContiguousSpacePool(young,
95 "Par Survivor Space",
96 young->max_survivor_size(),
97 false);
98
99 ConcurrentMarkSweepGeneration* old = (ConcurrentMarkSweepGeneration*) old_gen();
100 _old_pool = new CompactibleFreeListSpacePool(old->cmsSpace(),
101 "CMS Old Gen",
102 old->reserved().byte_size(),
103 true);
104
105 _young_manager->add_pool(_eden_pool);
106 _young_manager->add_pool(_survivor_pool);
107 young->set_gc_manager(_young_manager);
108
109 _old_manager->add_pool(_eden_pool);
110 _old_manager->add_pool(_survivor_pool);
111 _old_manager->add_pool(_old_pool);
112 old ->set_gc_manager(_old_manager);
113
114 return JNI_OK;
115 }
116
117 void CMSHeap::check_gen_kinds() {
118 assert(young_gen()->kind() == Generation::ParNew,
119 "Wrong youngest generation type");
120 assert(old_gen()->kind() == Generation::ConcurrentMarkSweep,
121 "Wrong generation kind");
122 }
123
124 CMSHeap* CMSHeap::heap() {
125 CollectedHeap* heap = Universe::heap();
126 assert(heap != NULL, "Uninitialized access to CMSHeap::heap()");
127 assert(heap->kind() == CollectedHeap::CMSHeap, "Not a CMSHeap");
128 return (CMSHeap*) heap;
129 }
130
131 void CMSHeap::gc_threads_do(ThreadClosure* tc) const {
132 assert(workers() != NULL, "should have workers here");
229 root_closure->set_generation(young_gen());
230 young_gen()->oop_iterate(root_closure);
231 root_closure->reset_generation();
232 }
233
234 _process_strong_tasks->all_tasks_completed(scope->n_threads());
235 }
236
237 void CMSHeap::gc_prologue(bool full) {
238 always_do_update_barrier = false;
239 GenCollectedHeap::gc_prologue(full);
240 };
241
242 void CMSHeap::gc_epilogue(bool full) {
243 GenCollectedHeap::gc_epilogue(full);
244 always_do_update_barrier = true;
245 };
246
247 GrowableArray<GCMemoryManager*> CMSHeap::memory_managers() {
248 GrowableArray<GCMemoryManager*> memory_managers(2);
249 memory_managers.append(_young_manager);
250 memory_managers.append(_old_manager);
251 return memory_managers;
252 }
253
254 GrowableArray<MemoryPool*> CMSHeap::memory_pools() {
255 GrowableArray<MemoryPool*> memory_pools(3);
256 memory_pools.append(_eden_pool);
257 memory_pools.append(_survivor_pool);
258 memory_pools.append(_old_pool);
259 return memory_pools;
260 }
|