28 #include "gc/cms/parNewGeneration.hpp" |
28 #include "gc/cms/parNewGeneration.hpp" |
29 #include "gc/cms/parOopClosures.hpp" |
29 #include "gc/cms/parOopClosures.hpp" |
30 #include "gc/shared/cardTableRS.hpp" |
30 #include "gc/shared/cardTableRS.hpp" |
31 #include "gc/shared/genCollectedHeap.hpp" |
31 #include "gc/shared/genCollectedHeap.hpp" |
32 #include "gc/shared/genOopClosures.inline.hpp" |
32 #include "gc/shared/genOopClosures.inline.hpp" |
|
33 #include "logging/log.hpp" |
33 |
34 |
34 template <class T> inline void ParScanWeakRefClosure::do_oop_work(T* p) { |
35 template <class T> inline void ParScanWeakRefClosure::do_oop_work(T* p) { |
35 assert (!oopDesc::is_null(*p), "null weak reference?"); |
36 assert (!oopDesc::is_null(*p), "null weak reference?"); |
36 oop obj = oopDesc::load_decode_heap_oop_not_null(p); |
37 oop obj = oopDesc::load_decode_heap_oop_not_null(p); |
37 // weak references are sometimes scanned twice; must check |
38 // weak references are sometimes scanned twice; must check |
106 markOop m = obj->mark(); |
107 markOop m = obj->mark(); |
107 oop new_obj; |
108 oop new_obj; |
108 if (m->is_marked()) { // Contains forwarding pointer. |
109 if (m->is_marked()) { // Contains forwarding pointer. |
109 new_obj = ParNewGeneration::real_forwardee(obj); |
110 new_obj = ParNewGeneration::real_forwardee(obj); |
110 oopDesc::encode_store_heap_oop_not_null(p, new_obj); |
111 oopDesc::encode_store_heap_oop_not_null(p, new_obj); |
111 if (TraceScavenge) { |
112 log_develop_trace(gc, scavenge)("{%s %s ( " PTR_FORMAT " ) " PTR_FORMAT " -> " PTR_FORMAT " (%d)}", |
112 gclog_or_tty->print_cr("{%s %s ( " PTR_FORMAT " ) " PTR_FORMAT " -> " PTR_FORMAT " (%d)}", |
113 "forwarded ", |
113 "forwarded ", |
114 new_obj->klass()->internal_name(), p2i(p), p2i((void *)obj), p2i((void *)new_obj), new_obj->size()); |
114 new_obj->klass()->internal_name(), p2i(p), p2i((void *)obj), p2i((void *)new_obj), new_obj->size()); |
|
115 } |
|
116 } else { |
115 } else { |
117 size_t obj_sz = obj->size_given_klass(objK); |
116 size_t obj_sz = obj->size_given_klass(objK); |
118 new_obj = _g->copy_to_survivor_space(_par_scan_state, obj, obj_sz, m); |
117 new_obj = _g->copy_to_survivor_space(_par_scan_state, obj, obj_sz, m); |
119 oopDesc::encode_store_heap_oop_not_null(p, new_obj); |
118 oopDesc::encode_store_heap_oop_not_null(p, new_obj); |
120 if (root_scan) { |
119 if (root_scan) { |