17 *
18 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
19 * or visit www.oracle.com if you need additional information or have any
20 * questions.
21 *
22 */
23
24 #include "precompiled.hpp"
25 #include "aot/aotLoader.hpp"
26 #include "classfile/classLoaderDataGraph.hpp"
27 #include "classfile/systemDictionary.hpp"
28 #include "code/codeCache.hpp"
29 #include "gc/parallel/parallelScavengeHeap.hpp"
30 #include "gc/parallel/pcTasks.hpp"
31 #include "gc/parallel/psCompactionManager.inline.hpp"
32 #include "gc/parallel/psParallelCompact.inline.hpp"
33 #include "gc/shared/collectedHeap.hpp"
34 #include "gc/shared/gcTimer.hpp"
35 #include "gc/shared/gcTraceTime.inline.hpp"
36 #include "logging/log.hpp"
37 #include "memory/resourceArea.hpp"
38 #include "memory/universe.hpp"
39 #include "oops/objArrayKlass.inline.hpp"
40 #include "oops/oop.inline.hpp"
41 #include "prims/jvmtiExport.hpp"
42 #include "runtime/jniHandles.hpp"
43 #include "runtime/thread.hpp"
44 #include "runtime/vmThread.hpp"
45 #include "services/management.hpp"
46 #include "utilities/stack.inline.hpp"
47
48 //
49 // ThreadRootsMarkingTask
50 //
51
52 void ThreadRootsMarkingTask::do_it(GCTaskManager* manager, uint which) {
53 assert(ParallelScavengeHeap::heap()->is_gc_active(), "called outside gc");
54
55 ResourceMark rm;
56
57 ParCompactionManager* cm =
58 ParCompactionManager::gc_thread_compaction_manager(which);
59
60 ParCompactionManager::MarkAndPushClosure mark_and_push_closure(cm);
61 MarkingCodeBlobClosure mark_and_push_in_blobs(&mark_and_push_closure, !CodeBlobToOopClosure::FixRelocations);
62
63 _thread->oops_do(&mark_and_push_closure, &mark_and_push_in_blobs);
64
65 // Do the real work
66 cm->follow_marking_stacks();
67 }
68
69
70 void MarkFromRootsTask::do_it(GCTaskManager* manager, uint which) {
71 assert(ParallelScavengeHeap::heap()->is_gc_active(), "called outside gc");
72
73 ParCompactionManager* cm =
74 ParCompactionManager::gc_thread_compaction_manager(which);
75 ParCompactionManager::MarkAndPushClosure mark_and_push_closure(cm);
76
77 switch (_root_type) {
78 case universe:
79 Universe::oops_do(&mark_and_push_closure);
80 break;
81
82 case jni_handles:
83 JNIHandles::oops_do(&mark_and_push_closure);
84 break;
85
86 case threads:
87 {
88 ResourceMark rm;
89 MarkingCodeBlobClosure each_active_code_blob(&mark_and_push_closure, !CodeBlobToOopClosure::FixRelocations);
90 Threads::oops_do(&mark_and_push_closure, &each_active_code_blob);
91 }
92 break;
93
94 case object_synchronizer:
|
17 *
18 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
19 * or visit www.oracle.com if you need additional information or have any
20 * questions.
21 *
22 */
23
24 #include "precompiled.hpp"
25 #include "aot/aotLoader.hpp"
26 #include "classfile/classLoaderDataGraph.hpp"
27 #include "classfile/systemDictionary.hpp"
28 #include "code/codeCache.hpp"
29 #include "gc/parallel/parallelScavengeHeap.hpp"
30 #include "gc/parallel/pcTasks.hpp"
31 #include "gc/parallel/psCompactionManager.inline.hpp"
32 #include "gc/parallel/psParallelCompact.inline.hpp"
33 #include "gc/shared/collectedHeap.hpp"
34 #include "gc/shared/gcTimer.hpp"
35 #include "gc/shared/gcTraceTime.inline.hpp"
36 #include "logging/log.hpp"
37 #include "memory/iterator.inline.hpp"
38 #include "memory/resourceArea.hpp"
39 #include "memory/universe.hpp"
40 #include "oops/objArrayKlass.inline.hpp"
41 #include "oops/oop.inline.hpp"
42 #include "prims/jvmtiExport.hpp"
43 #include "runtime/jniHandles.hpp"
44 #include "runtime/thread.hpp"
45 #include "runtime/vmThread.hpp"
46 #include "services/management.hpp"
47 #include "utilities/stack.inline.hpp"
48
49 //
50 // ThreadRootsMarkingTask
51 //
52
53 void ThreadRootsMarkingTask::do_it(GCTaskManager* manager, uint which) {
54 assert(ParallelScavengeHeap::heap()->is_gc_active(), "called outside gc");
55
56 ResourceMark rm;
57
58 ParCompactionManager* cm =
59 ParCompactionManager::gc_thread_compaction_manager(which);
60
61 PCMarkAndPushClosure mark_and_push_closure(cm);
62 MarkingCodeBlobClosure mark_and_push_in_blobs(&mark_and_push_closure, !CodeBlobToOopClosure::FixRelocations);
63
64 _thread->oops_do(&mark_and_push_closure, &mark_and_push_in_blobs);
65
66 // Do the real work
67 cm->follow_marking_stacks();
68 }
69
70
71 void MarkFromRootsTask::do_it(GCTaskManager* manager, uint which) {
72 assert(ParallelScavengeHeap::heap()->is_gc_active(), "called outside gc");
73
74 ParCompactionManager* cm =
75 ParCompactionManager::gc_thread_compaction_manager(which);
76 PCMarkAndPushClosure mark_and_push_closure(cm);
77
78 switch (_root_type) {
79 case universe:
80 Universe::oops_do(&mark_and_push_closure);
81 break;
82
83 case jni_handles:
84 JNIHandles::oops_do(&mark_and_push_closure);
85 break;
86
87 case threads:
88 {
89 ResourceMark rm;
90 MarkingCodeBlobClosure each_active_code_blob(&mark_and_push_closure, !CodeBlobToOopClosure::FixRelocations);
91 Threads::oops_do(&mark_and_push_closure, &each_active_code_blob);
92 }
93 break;
94
95 case object_synchronizer:
|
121
122 default:
123 fatal("Unknown root type");
124 }
125
126 // Do the real work
127 cm->follow_marking_stacks();
128 }
129
130
131 //
132 // RefProcTaskProxy
133 //
134
135 void RefProcTaskProxy::do_it(GCTaskManager* manager, uint which)
136 {
137 assert(ParallelScavengeHeap::heap()->is_gc_active(), "called outside gc");
138
139 ParCompactionManager* cm =
140 ParCompactionManager::gc_thread_compaction_manager(which);
141 ParCompactionManager::MarkAndPushClosure mark_and_push_closure(cm);
142 ParCompactionManager::FollowStackClosure follow_stack_closure(cm);
143 _rp_task.work(_work_id, *PSParallelCompact::is_alive_closure(),
144 mark_and_push_closure, follow_stack_closure);
145 }
146
147 //
148 // RefProcTaskExecutor
149 //
150
151 void RefProcTaskExecutor::execute(ProcessTask& task, uint ergo_workers)
152 {
153 ParallelScavengeHeap* heap = ParallelScavengeHeap::heap();
154 uint active_gc_threads = heap->gc_task_manager()->active_workers();
155 assert(active_gc_threads == ergo_workers,
156 "Ergonomically chosen workers (%u) must be equal to active workers (%u)",
157 ergo_workers, active_gc_threads);
158 OopTaskQueueSet* qset = ParCompactionManager::stack_array();
159 ParallelTaskTerminator terminator(active_gc_threads, qset);
160 GCTaskQueue* q = GCTaskQueue::create();
|
122
123 default:
124 fatal("Unknown root type");
125 }
126
127 // Do the real work
128 cm->follow_marking_stacks();
129 }
130
131
132 //
133 // RefProcTaskProxy
134 //
135
136 void RefProcTaskProxy::do_it(GCTaskManager* manager, uint which)
137 {
138 assert(ParallelScavengeHeap::heap()->is_gc_active(), "called outside gc");
139
140 ParCompactionManager* cm =
141 ParCompactionManager::gc_thread_compaction_manager(which);
142 PCMarkAndPushClosure mark_and_push_closure(cm);
143 ParCompactionManager::FollowStackClosure follow_stack_closure(cm);
144 _rp_task.work(_work_id, *PSParallelCompact::is_alive_closure(),
145 mark_and_push_closure, follow_stack_closure);
146 }
147
148 //
149 // RefProcTaskExecutor
150 //
151
152 void RefProcTaskExecutor::execute(ProcessTask& task, uint ergo_workers)
153 {
154 ParallelScavengeHeap* heap = ParallelScavengeHeap::heap();
155 uint active_gc_threads = heap->gc_task_manager()->active_workers();
156 assert(active_gc_threads == ergo_workers,
157 "Ergonomically chosen workers (%u) must be equal to active workers (%u)",
158 ergo_workers, active_gc_threads);
159 OopTaskQueueSet* qset = ParCompactionManager::stack_array();
160 ParallelTaskTerminator terminator(active_gc_threads, qset);
161 GCTaskQueue* q = GCTaskQueue::create();
|
164 if (task.marks_oops_alive() && (active_gc_threads>1)) {
165 for (uint j=0; j<active_gc_threads; j++) {
166 q->enqueue(new StealMarkingTask(&terminator));
167 }
168 }
169 PSParallelCompact::gc_task_manager()->execute_and_wait(q);
170 }
171
172 //
173 // StealMarkingTask
174 //
175
176 StealMarkingTask::StealMarkingTask(ParallelTaskTerminator* t) :
177 _terminator(t) {}
178
179 void StealMarkingTask::do_it(GCTaskManager* manager, uint which) {
180 assert(ParallelScavengeHeap::heap()->is_gc_active(), "called outside gc");
181
182 ParCompactionManager* cm =
183 ParCompactionManager::gc_thread_compaction_manager(which);
184 ParCompactionManager::MarkAndPushClosure mark_and_push_closure(cm);
185
186 oop obj = NULL;
187 ObjArrayTask task;
188 do {
189 while (ParCompactionManager::steal_objarray(which, task)) {
190 cm->follow_contents((objArrayOop)task.obj(), task.index());
191 cm->follow_marking_stacks();
192 }
193 while (ParCompactionManager::steal(which, obj)) {
194 cm->follow_contents(obj);
195 cm->follow_marking_stacks();
196 }
197 } while (!terminator()->offer_termination());
198 }
199
200 //
201 // CompactionWithStealingTask
202 //
203
204 CompactionWithStealingTask::CompactionWithStealingTask(ParallelTaskTerminator* t):
205 _terminator(t) {}
206
207 void CompactionWithStealingTask::do_it(GCTaskManager* manager, uint which) {
208 assert(ParallelScavengeHeap::heap()->is_gc_active(), "called outside gc");
209
|
165 if (task.marks_oops_alive() && (active_gc_threads>1)) {
166 for (uint j=0; j<active_gc_threads; j++) {
167 q->enqueue(new StealMarkingTask(&terminator));
168 }
169 }
170 PSParallelCompact::gc_task_manager()->execute_and_wait(q);
171 }
172
173 //
174 // StealMarkingTask
175 //
176
177 StealMarkingTask::StealMarkingTask(ParallelTaskTerminator* t) :
178 _terminator(t) {}
179
180 void StealMarkingTask::do_it(GCTaskManager* manager, uint which) {
181 assert(ParallelScavengeHeap::heap()->is_gc_active(), "called outside gc");
182
183 ParCompactionManager* cm =
184 ParCompactionManager::gc_thread_compaction_manager(which);
185
186 oop obj = NULL;
187 ObjArrayTask task;
188 do {
189 while (ParCompactionManager::steal_objarray(which, task)) {
190 cm->follow_array((objArrayOop)task.obj(), task.index());
191 cm->follow_marking_stacks();
192 }
193 while (ParCompactionManager::steal(which, obj)) {
194 cm->follow_contents(obj);
195 cm->follow_marking_stacks();
196 }
197 } while (!terminator()->offer_termination());
198 }
199
200 //
201 // CompactionWithStealingTask
202 //
203
204 CompactionWithStealingTask::CompactionWithStealingTask(ParallelTaskTerminator* t):
205 _terminator(t) {}
206
207 void CompactionWithStealingTask::do_it(GCTaskManager* manager, uint which) {
208 assert(ParallelScavengeHeap::heap()->is_gc_active(), "called outside gc");
209
|