21 * questions. |
21 * questions. |
22 * |
22 * |
23 */ |
23 */ |
24 |
24 |
25 #include "precompiled.hpp" |
25 #include "precompiled.hpp" |
|
26 #include "classfile/javaClasses.inline.hpp" |
26 #include "gc/parallel/gcTaskManager.hpp" |
27 #include "gc/parallel/gcTaskManager.hpp" |
27 #include "gc/parallel/mutableSpace.hpp" |
28 #include "gc/parallel/mutableSpace.hpp" |
28 #include "gc/parallel/parallelScavengeHeap.hpp" |
29 #include "gc/parallel/parallelScavengeHeap.hpp" |
29 #include "gc/parallel/psOldGen.hpp" |
30 #include "gc/parallel/psOldGen.hpp" |
30 #include "gc/parallel/psPromotionManager.inline.hpp" |
31 #include "gc/parallel/psPromotionManager.inline.hpp" |
33 #include "gc/shared/preservedMarks.inline.hpp" |
34 #include "gc/shared/preservedMarks.inline.hpp" |
34 #include "gc/shared/taskqueue.inline.hpp" |
35 #include "gc/shared/taskqueue.inline.hpp" |
35 #include "logging/log.hpp" |
36 #include "logging/log.hpp" |
36 #include "logging/logStream.hpp" |
37 #include "logging/logStream.hpp" |
37 #include "memory/allocation.inline.hpp" |
38 #include "memory/allocation.inline.hpp" |
|
39 #include "memory/iterator.inline.hpp" |
38 #include "memory/memRegion.hpp" |
40 #include "memory/memRegion.hpp" |
39 #include "memory/padded.inline.hpp" |
41 #include "memory/padded.inline.hpp" |
40 #include "memory/resourceArea.hpp" |
42 #include "memory/resourceArea.hpp" |
41 #include "oops/access.inline.hpp" |
43 #include "oops/access.inline.hpp" |
42 #include "oops/arrayOop.inline.hpp" |
44 #include "oops/arrayOop.inline.hpp" |
43 #include "oops/compressedOops.inline.hpp" |
45 #include "oops/compressedOops.inline.hpp" |
|
46 #include "oops/instanceClassLoaderKlass.inline.hpp" |
44 #include "oops/instanceKlass.inline.hpp" |
47 #include "oops/instanceKlass.inline.hpp" |
45 #include "oops/instanceMirrorKlass.inline.hpp" |
48 #include "oops/instanceMirrorKlass.inline.hpp" |
46 #include "oops/objArrayKlass.inline.hpp" |
49 #include "oops/objArrayKlass.inline.hpp" |
47 #include "oops/objArrayOop.inline.hpp" |
50 #include "oops/objArrayOop.inline.hpp" |
48 #include "oops/oop.inline.hpp" |
51 #include "oops/oop.inline.hpp" |
392 } else { |
395 } else { |
393 process_array_chunk_work<oop>(obj, start, end); |
396 process_array_chunk_work<oop>(obj, start, end); |
394 } |
397 } |
395 } |
398 } |
396 |
399 |
397 class PushContentsClosure : public ExtendedOopClosure { |
400 class PushContentsClosure : public BasicOopIterateClosure { |
398 PSPromotionManager* _pm; |
401 PSPromotionManager* _pm; |
399 public: |
402 public: |
400 PushContentsClosure(PSPromotionManager* pm) : _pm(pm) {} |
403 PushContentsClosure(PSPromotionManager* pm) : _pm(pm) {} |
401 |
404 |
402 template <typename T> void do_oop_nv(T* p) { |
405 template <typename T> void do_oop_work(T* p) { |
403 if (PSScavenge::should_scavenge(p)) { |
406 if (PSScavenge::should_scavenge(p)) { |
404 _pm->claim_or_forward_depth(p); |
407 _pm->claim_or_forward_depth(p); |
405 } |
408 } |
406 } |
409 } |
407 |
410 |
408 virtual void do_oop(oop* p) { do_oop_nv(p); } |
411 virtual void do_oop(oop* p) { do_oop_work(p); } |
409 virtual void do_oop(narrowOop* p) { do_oop_nv(p); } |
412 virtual void do_oop(narrowOop* p) { do_oop_work(p); } |
410 |
413 |
411 // Don't use the oop verification code in the oop_oop_iterate framework. |
414 // Don't use the oop verification code in the oop_oop_iterate framework. |
412 debug_only(virtual bool should_verify_oops() { return false; }) |
415 debug_only(virtual bool should_verify_oops() { return false; }) |
413 }; |
416 }; |
414 |
417 |
415 void InstanceKlass::oop_ps_push_contents(oop obj, PSPromotionManager* pm) { |
418 void InstanceKlass::oop_ps_push_contents(oop obj, PSPromotionManager* pm) { |
416 PushContentsClosure cl(pm); |
419 PushContentsClosure cl(pm); |
417 oop_oop_iterate_oop_maps_reverse<true>(obj, &cl); |
420 if (UseCompressedOops) { |
|
421 oop_oop_iterate_oop_maps_reverse<narrowOop>(obj, &cl); |
|
422 } else { |
|
423 oop_oop_iterate_oop_maps_reverse<oop>(obj, &cl); |
|
424 } |
418 } |
425 } |
419 |
426 |
420 void InstanceMirrorKlass::oop_ps_push_contents(oop obj, PSPromotionManager* pm) { |
427 void InstanceMirrorKlass::oop_ps_push_contents(oop obj, PSPromotionManager* pm) { |
421 // Note that we don't have to follow the mirror -> klass pointer, since all |
428 // Note that we don't have to follow the mirror -> klass pointer, since all |
422 // klasses that are dirty will be scavenged when we iterate over the |
429 // klasses that are dirty will be scavenged when we iterate over the |
423 // ClassLoaderData objects. |
430 // ClassLoaderData objects. |
424 |
431 |
425 InstanceKlass::oop_ps_push_contents(obj, pm); |
432 InstanceKlass::oop_ps_push_contents(obj, pm); |
426 |
433 |
427 PushContentsClosure cl(pm); |
434 PushContentsClosure cl(pm); |
428 oop_oop_iterate_statics<true>(obj, &cl); |
435 if (UseCompressedOops) { |
|
436 oop_oop_iterate_statics<narrowOop>(obj, &cl); |
|
437 } else { |
|
438 oop_oop_iterate_statics<oop>(obj, &cl); |
|
439 } |
429 } |
440 } |
430 |
441 |
431 void InstanceClassLoaderKlass::oop_ps_push_contents(oop obj, PSPromotionManager* pm) { |
442 void InstanceClassLoaderKlass::oop_ps_push_contents(oop obj, PSPromotionManager* pm) { |
432 InstanceKlass::oop_ps_push_contents(obj, pm); |
443 InstanceKlass::oop_ps_push_contents(obj, pm); |
433 |
444 |
467 } |
478 } |
468 |
479 |
469 void ObjArrayKlass::oop_ps_push_contents(oop obj, PSPromotionManager* pm) { |
480 void ObjArrayKlass::oop_ps_push_contents(oop obj, PSPromotionManager* pm) { |
470 assert(obj->is_objArray(), "obj must be obj array"); |
481 assert(obj->is_objArray(), "obj must be obj array"); |
471 PushContentsClosure cl(pm); |
482 PushContentsClosure cl(pm); |
472 oop_oop_iterate_elements<true>(objArrayOop(obj), &cl); |
483 if (UseCompressedOops) { |
|
484 oop_oop_iterate_elements<narrowOop>(objArrayOop(obj), &cl); |
|
485 } else { |
|
486 oop_oop_iterate_elements<oop>(objArrayOop(obj), &cl); |
|
487 } |
473 } |
488 } |
474 |
489 |
475 void TypeArrayKlass::oop_ps_push_contents(oop obj, PSPromotionManager* pm) { |
490 void TypeArrayKlass::oop_ps_push_contents(oop obj, PSPromotionManager* pm) { |
476 assert(obj->is_typeArray(),"must be a type array"); |
491 assert(obj->is_typeArray(),"must be a type array"); |
477 ShouldNotReachHere(); |
492 ShouldNotReachHere(); |