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 #include "precompiled.hpp"
26 #include "classfile/javaClasses.hpp"
27 #include "classfile/systemDictionary.hpp"
28 #include "gc/shared/collectedHeap.hpp"
29 #include "gc/shared/collectedHeap.inline.hpp"
30 #include "gc/shared/gcTimer.hpp"
31 #include "gc/shared/gcTraceTime.hpp"
32 #include "gc/shared/referencePolicy.hpp"
33 #include "gc/shared/referenceProcessor.hpp"
34 #include "memory/allocation.hpp"
35 #include "oops/oop.inline.hpp"
36 #include "runtime/java.hpp"
37 #include "runtime/jniHandles.hpp"
38
39 ReferencePolicy* ReferenceProcessor::_always_clear_soft_ref_policy = NULL;
40 ReferencePolicy* ReferenceProcessor::_default_soft_ref_policy = NULL;
41 jlong ReferenceProcessor::_soft_ref_timestamp_clock = 0;
42
43 void referenceProcessor_init() {
44 ReferenceProcessor::init_statics();
45 }
46
47 void ReferenceProcessor::init_statics() {
48 // We need a monotonically non-decreasing time in ms but
49 // os::javaTimeMillis() does not guarantee monotonicity.
50 jlong now = os::javaTimeNanos() / NANOSECS_PER_MILLISEC;
51
52 // Initialize the soft ref timestamp clock.
53 _soft_ref_timestamp_clock = now;
169 // javaTimeNanos(), which is guaranteed to be monotonically
170 // non-decreasing provided the underlying platform provides such
171 // a time source (and it is bug free).
172 // In product mode, however, protect ourselves from non-monotonicity.
173 if (now > _soft_ref_timestamp_clock) {
174 _soft_ref_timestamp_clock = now;
175 java_lang_ref_SoftReference::set_clock(now);
176 }
177 // Else leave clock stalled at its old value until time progresses
178 // past clock value.
179 }
180
181 size_t ReferenceProcessor::total_count(DiscoveredList lists[]) {
182 size_t total = 0;
183 for (uint i = 0; i < _max_num_q; ++i) {
184 total += lists[i].length();
185 }
186 return total;
187 }
188
189 static void log_ref_count(size_t count, bool doit) {
190 if (doit) {
191 gclog_or_tty->print(", " SIZE_FORMAT " refs", count);
192 }
193 }
194
195 class GCRefTraceTime : public StackObj {
196 GCTraceTimeImpl _gc_trace_time;
197 public:
198 GCRefTraceTime(const char* title, bool doit, GCTimer* timer, size_t count) :
199 _gc_trace_time(title, doit, false, timer) {
200 log_ref_count(count, doit);
201 }
202 };
203
204 ReferenceProcessorStats ReferenceProcessor::process_discovered_references(
205 BoolObjectClosure* is_alive,
206 OopClosure* keep_alive,
207 VoidClosure* complete_gc,
208 AbstractRefProcTaskExecutor* task_executor,
209 GCTimer* gc_timer) {
210
211 assert(!enqueuing_is_done(), "If here enqueuing should not be complete");
212 // Stop treating discovered references specially.
213 disable_discovery();
214
215 // If discovery was concurrent, someone could have modified
216 // the value of the static field in the j.l.r.SoftReference
217 // class that holds the soft reference timestamp clock using
218 // reflection or Unsafe between when discovery was enabled and
219 // now. Unconditionally update the static field in ReferenceProcessor
220 // here so that we use the new value during processing of the
221 // discovered soft refs.
222
223 _soft_ref_timestamp_clock = java_lang_ref_SoftReference::clock();
224
225 bool trace_time = PrintGCDetails && PrintReferenceGC;
226
227 // Include cleaners in phantom statistics. We expect Cleaner
228 // references to be temporary, and don't want to deal with
229 // possible incompatibilities arising from making it more visible.
230 ReferenceProcessorStats stats(
231 total_count(_discoveredSoftRefs),
232 total_count(_discoveredWeakRefs),
233 total_count(_discoveredFinalRefs),
234 total_count(_discoveredPhantomRefs) + total_count(_discoveredCleanerRefs));
235
236 // Soft references
237 {
238 GCRefTraceTime tt("SoftReference", trace_time, gc_timer, stats.soft_count());
239 process_discovered_reflist(_discoveredSoftRefs, _current_soft_ref_policy, true,
240 is_alive, keep_alive, complete_gc, task_executor);
241 }
242
243 update_soft_ref_master_clock();
244
245 // Weak references
246 {
247 GCRefTraceTime tt("WeakReference", trace_time, gc_timer, stats.weak_count());
248 process_discovered_reflist(_discoveredWeakRefs, NULL, true,
249 is_alive, keep_alive, complete_gc, task_executor);
250 }
251
252 // Final references
253 {
254 GCRefTraceTime tt("FinalReference", trace_time, gc_timer, stats.final_count());
255 process_discovered_reflist(_discoveredFinalRefs, NULL, false,
256 is_alive, keep_alive, complete_gc, task_executor);
257 }
258
259 // Phantom references
260 {
261 GCRefTraceTime tt("PhantomReference", trace_time, gc_timer, stats.phantom_count());
262 process_discovered_reflist(_discoveredPhantomRefs, NULL, false,
263 is_alive, keep_alive, complete_gc, task_executor);
264
265 // Process cleaners, but include them in phantom timing. We expect
266 // Cleaner references to be temporary, and don't want to deal with
267 // possible incompatibilities arising from making it more visible.
268 process_discovered_reflist(_discoveredCleanerRefs, NULL, true,
269 is_alive, keep_alive, complete_gc, task_executor);
270 }
271
272 // Weak global JNI references. It would make more sense (semantically) to
273 // traverse these simultaneously with the regular weak references above, but
274 // that is not how the JDK1.2 specification is. See #4126360. Native code can
275 // thus use JNI weak references to circumvent the phantom references and
276 // resurrect a "post-mortem" object.
277 {
278 GCTraceTime tt("JNI Weak Reference", trace_time, false, gc_timer);
279 NOT_PRODUCT(log_ref_count(count_jni_refs(), trace_time);)
280 if (task_executor != NULL) {
281 task_executor->set_single_threaded_mode();
282 }
283 process_phaseJNI(is_alive, keep_alive, complete_gc);
284 }
285
286 return stats;
287 }
288
289 #ifndef PRODUCT
290 // Calculate the number of jni handles.
291 uint ReferenceProcessor::count_jni_refs() {
292 class AlwaysAliveClosure: public BoolObjectClosure {
293 public:
294 virtual bool do_object_b(oop obj) { return true; }
295 };
296
297 class CountHandleClosure: public OopClosure {
298 private:
299 int _count;
300 public:
301 CountHandleClosure(): _count(0) {}
302 void do_oop(oop* unused) { _count++; }
303 void do_oop(narrowOop* unused) { ShouldNotReachHere(); }
304 int count() { return _count; }
305 };
306 CountHandleClosure global_handle_count;
307 AlwaysAliveClosure always_alive;
308 JNIHandles::weak_oops_do(&always_alive, &global_handle_count);
309 return global_handle_count.count();
310 }
311 #endif
312
313 void ReferenceProcessor::process_phaseJNI(BoolObjectClosure* is_alive,
314 OopClosure* keep_alive,
315 VoidClosure* complete_gc) {
316 JNIHandles::weak_oops_do(is_alive, keep_alive);
317 complete_gc->do_void();
318 }
319
320
321 template <class T>
322 bool enqueue_discovered_ref_helper(ReferenceProcessor* ref,
323 AbstractRefProcTaskExecutor* task_executor) {
324
345 return enqueue_discovered_ref_helper<narrowOop>(this, task_executor);
346 } else {
347 return enqueue_discovered_ref_helper<oop>(this, task_executor);
348 }
349 }
350
351 void ReferenceProcessor::enqueue_discovered_reflist(DiscoveredList& refs_list,
352 HeapWord* pending_list_addr) {
353 // Given a list of refs linked through the "discovered" field
354 // (java.lang.ref.Reference.discovered), self-loop their "next" field
355 // thus distinguishing them from active References, then
356 // prepend them to the pending list.
357 //
358 // The Java threads will see the Reference objects linked together through
359 // the discovered field. Instead of trying to do the write barrier updates
360 // in all places in the reference processor where we manipulate the discovered
361 // field we make sure to do the barrier here where we anyway iterate through
362 // all linked Reference objects. Note that it is important to not dirty any
363 // cards during reference processing since this will cause card table
364 // verification to fail for G1.
365 if (TraceReferenceGC && PrintGCDetails) {
366 gclog_or_tty->print_cr("ReferenceProcessor::enqueue_discovered_reflist list "
367 INTPTR_FORMAT, p2i(refs_list.head()));
368 }
369
370 oop obj = NULL;
371 oop next_d = refs_list.head();
372 // Walk down the list, self-looping the next field
373 // so that the References are not considered active.
374 while (obj != next_d) {
375 obj = next_d;
376 assert(obj->is_instance(), "should be an instance object");
377 assert(InstanceKlass::cast(obj->klass())->is_reference_instance_klass(), "should be reference object");
378 next_d = java_lang_ref_Reference::discovered(obj);
379 if (TraceReferenceGC && PrintGCDetails) {
380 gclog_or_tty->print_cr(" obj " INTPTR_FORMAT "/next_d " INTPTR_FORMAT,
381 p2i(obj), p2i(next_d));
382 }
383 assert(java_lang_ref_Reference::next(obj) == NULL,
384 "Reference not active; should not be discovered");
385 // Self-loop next, so as to make Ref not active.
386 java_lang_ref_Reference::set_next_raw(obj, obj);
387 if (next_d != obj) {
388 oopDesc::bs()->write_ref_field(java_lang_ref_Reference::discovered_addr(obj), next_d);
389 } else {
390 // This is the last object.
391 // Swap refs_list into pending_list_addr and
392 // set obj's discovered to what we read from pending_list_addr.
393 oop old = oopDesc::atomic_exchange_oop(refs_list.head(), pending_list_addr);
394 // Need post-barrier on pending_list_addr. See enqueue_discovered_ref_helper() above.
395 java_lang_ref_Reference::set_discovered_raw(obj, old); // old may be NULL
396 oopDesc::bs()->write_ref_field(java_lang_ref_Reference::discovered_addr(obj), old);
397 }
398 }
399 }
400
401 // Parallel enqueue task
402 class RefProcEnqueueTask: public AbstractRefProcTaskExecutor::EnqueueTask {
500 // a single general iterator invocation that receives appropriate
501 // closures that accomplish this work.
502
503 // (SoftReferences only) Traverse the list and remove any SoftReferences whose
504 // referents are not alive, but that should be kept alive for policy reasons.
505 // Keep alive the transitive closure of all such referents.
506 void
507 ReferenceProcessor::process_phase1(DiscoveredList& refs_list,
508 ReferencePolicy* policy,
509 BoolObjectClosure* is_alive,
510 OopClosure* keep_alive,
511 VoidClosure* complete_gc) {
512 assert(policy != NULL, "Must have a non-NULL policy");
513 DiscoveredListIterator iter(refs_list, keep_alive, is_alive);
514 // Decide which softly reachable refs should be kept alive.
515 while (iter.has_next()) {
516 iter.load_ptrs(DEBUG_ONLY(!discovery_is_atomic() /* allow_null_referent */));
517 bool referent_is_dead = (iter.referent() != NULL) && !iter.is_referent_alive();
518 if (referent_is_dead &&
519 !policy->should_clear_reference(iter.obj(), _soft_ref_timestamp_clock)) {
520 if (TraceReferenceGC) {
521 gclog_or_tty->print_cr("Dropping reference (" INTPTR_FORMAT ": %s" ") by policy",
522 p2i(iter.obj()), iter.obj()->klass()->internal_name());
523 }
524 // Remove Reference object from list
525 iter.remove();
526 // keep the referent around
527 iter.make_referent_alive();
528 iter.move_to_next();
529 } else {
530 iter.next();
531 }
532 }
533 // Close the reachable set
534 complete_gc->do_void();
535 NOT_PRODUCT(
536 if (PrintGCDetails && TraceReferenceGC) {
537 gclog_or_tty->print_cr(" Dropped " SIZE_FORMAT " dead Refs out of " SIZE_FORMAT
538 " discovered Refs by policy, from list " INTPTR_FORMAT,
539 iter.removed(), iter.processed(), p2i(refs_list.head()));
540 }
541 )
542 }
543
544 // Traverse the list and remove any Refs that are not active, or
545 // whose referents are either alive or NULL.
546 void
547 ReferenceProcessor::pp2_work(DiscoveredList& refs_list,
548 BoolObjectClosure* is_alive,
549 OopClosure* keep_alive) {
550 assert(discovery_is_atomic(), "Error");
551 DiscoveredListIterator iter(refs_list, keep_alive, is_alive);
552 while (iter.has_next()) {
553 iter.load_ptrs(DEBUG_ONLY(false /* allow_null_referent */));
554 DEBUG_ONLY(oop next = java_lang_ref_Reference::next(iter.obj());)
555 assert(next == NULL, "Should not discover inactive Reference");
556 if (iter.is_referent_alive()) {
557 if (TraceReferenceGC) {
558 gclog_or_tty->print_cr("Dropping strongly reachable reference (" INTPTR_FORMAT ": %s)",
559 p2i(iter.obj()), iter.obj()->klass()->internal_name());
560 }
561 // The referent is reachable after all.
562 // Remove Reference object from list.
563 iter.remove();
564 // Update the referent pointer as necessary: Note that this
565 // should not entail any recursive marking because the
566 // referent must already have been traversed.
567 iter.make_referent_alive();
568 iter.move_to_next();
569 } else {
570 iter.next();
571 }
572 }
573 NOT_PRODUCT(
574 if (PrintGCDetails && TraceReferenceGC && (iter.processed() > 0)) {
575 gclog_or_tty->print_cr(" Dropped " SIZE_FORMAT " active Refs out of " SIZE_FORMAT
576 " Refs in discovered list " INTPTR_FORMAT,
577 iter.removed(), iter.processed(), p2i(refs_list.head()));
578 }
579 )
580 }
581
582 void
583 ReferenceProcessor::pp2_work_concurrent_discovery(DiscoveredList& refs_list,
584 BoolObjectClosure* is_alive,
585 OopClosure* keep_alive,
586 VoidClosure* complete_gc) {
587 assert(!discovery_is_atomic(), "Error");
588 DiscoveredListIterator iter(refs_list, keep_alive, is_alive);
589 while (iter.has_next()) {
590 iter.load_ptrs(DEBUG_ONLY(true /* allow_null_referent */));
591 HeapWord* next_addr = java_lang_ref_Reference::next_addr(iter.obj());
592 oop next = java_lang_ref_Reference::next(iter.obj());
593 if ((iter.referent() == NULL || iter.is_referent_alive() ||
594 next != NULL)) {
595 assert(next->is_oop_or_null(), "Expected an oop or NULL for next field at " PTR_FORMAT, p2i(next));
596 // Remove Reference object from list
597 iter.remove();
598 // Trace the cohorts
599 iter.make_referent_alive();
600 if (UseCompressedOops) {
601 keep_alive->do_oop((narrowOop*)next_addr);
602 } else {
603 keep_alive->do_oop((oop*)next_addr);
604 }
605 iter.move_to_next();
606 } else {
607 iter.next();
608 }
609 }
610 // Now close the newly reachable set
611 complete_gc->do_void();
612 NOT_PRODUCT(
613 if (PrintGCDetails && TraceReferenceGC && (iter.processed() > 0)) {
614 gclog_or_tty->print_cr(" Dropped " SIZE_FORMAT " active Refs out of " SIZE_FORMAT
615 " Refs in discovered list " INTPTR_FORMAT,
616 iter.removed(), iter.processed(), p2i(refs_list.head()));
617 }
618 )
619 }
620
621 // Traverse the list and process the referents, by either
622 // clearing them or keeping them (and their reachable
623 // closure) alive.
624 void
625 ReferenceProcessor::process_phase3(DiscoveredList& refs_list,
626 bool clear_referent,
627 BoolObjectClosure* is_alive,
628 OopClosure* keep_alive,
629 VoidClosure* complete_gc) {
630 ResourceMark rm;
631 DiscoveredListIterator iter(refs_list, keep_alive, is_alive);
632 while (iter.has_next()) {
633 iter.load_ptrs(DEBUG_ONLY(false /* allow_null_referent */));
634 if (clear_referent) {
635 // NULL out referent pointer
636 iter.clear_referent();
637 } else {
638 // keep the referent around
639 iter.make_referent_alive();
640 }
641 if (TraceReferenceGC) {
642 gclog_or_tty->print_cr("Adding %sreference (" INTPTR_FORMAT ": %s) as pending",
643 clear_referent ? "cleared " : "",
644 p2i(iter.obj()), iter.obj()->klass()->internal_name());
645 }
646 assert(iter.obj()->is_oop(UseConcMarkSweepGC), "Adding a bad reference");
647 iter.next();
648 }
649 // Close the reachable set
650 complete_gc->do_void();
651 }
652
653 void
654 ReferenceProcessor::clear_discovered_references(DiscoveredList& refs_list) {
655 oop obj = NULL;
656 oop next = refs_list.head();
657 while (next != obj) {
658 obj = next;
659 next = java_lang_ref_Reference::discovered(obj);
660 java_lang_ref_Reference::set_discovered_raw(obj, NULL);
661 }
662 refs_list.set_head(NULL);
663 refs_list.set_length(0);
664 }
665
666 void ReferenceProcessor::abandon_partial_discovery() {
667 // loop over the lists
668 for (uint i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) {
669 if (TraceReferenceGC && PrintGCDetails && ((i % _max_num_q) == 0)) {
670 gclog_or_tty->print_cr("\nAbandoning %s discovered list", list_name(i));
671 }
672 clear_discovered_references(_discovered_refs[i]);
673 }
674 }
675
676 class RefProcPhase1Task: public AbstractRefProcTaskExecutor::ProcessTask {
677 public:
678 RefProcPhase1Task(ReferenceProcessor& ref_processor,
679 DiscoveredList refs_lists[],
680 ReferencePolicy* policy,
681 bool marks_oops_alive)
682 : ProcessTask(ref_processor, refs_lists, marks_oops_alive),
683 _policy(policy)
684 { }
685 virtual void work(unsigned int i, BoolObjectClosure& is_alive,
686 OopClosure& keep_alive,
687 VoidClosure& complete_gc)
688 {
689 Thread* thr = Thread::current();
690 int refs_list_index = ((WorkerThread*)thr)->id();
719 bool marks_oops_alive)
720 : ProcessTask(ref_processor, refs_lists, marks_oops_alive),
721 _clear_referent(clear_referent)
722 { }
723 virtual void work(unsigned int i, BoolObjectClosure& is_alive,
724 OopClosure& keep_alive,
725 VoidClosure& complete_gc)
726 {
727 // Don't use "refs_list_index" calculated in this way because
728 // balance_queues() has moved the Ref's into the first n queues.
729 // Thread* thr = Thread::current();
730 // int refs_list_index = ((WorkerThread*)thr)->id();
731 // _ref_processor.process_phase3(_refs_lists[refs_list_index], _clear_referent,
732 _ref_processor.process_phase3(_refs_lists[i], _clear_referent,
733 &is_alive, &keep_alive, &complete_gc);
734 }
735 private:
736 bool _clear_referent;
737 };
738
739 // Balances reference queues.
740 // Move entries from all queues[0, 1, ..., _max_num_q-1] to
741 // queues[0, 1, ..., _num_q-1] because only the first _num_q
742 // corresponding to the active workers will be processed.
743 void ReferenceProcessor::balance_queues(DiscoveredList ref_lists[])
744 {
745 // calculate total length
746 size_t total_refs = 0;
747 if (TraceReferenceGC && PrintGCDetails) {
748 gclog_or_tty->print_cr("\nBalance ref_lists ");
749 }
750
751 for (uint i = 0; i < _max_num_q; ++i) {
752 total_refs += ref_lists[i].length();
753 if (TraceReferenceGC && PrintGCDetails) {
754 gclog_or_tty->print(SIZE_FORMAT " ", ref_lists[i].length());
755 }
756 }
757 if (TraceReferenceGC && PrintGCDetails) {
758 gclog_or_tty->print_cr(" = " SIZE_FORMAT, total_refs);
759 }
760 size_t avg_refs = total_refs / _num_q + 1;
761 uint to_idx = 0;
762 for (uint from_idx = 0; from_idx < _max_num_q; from_idx++) {
763 bool move_all = false;
764 if (from_idx >= _num_q) {
765 move_all = ref_lists[from_idx].length() > 0;
766 }
767 while ((ref_lists[from_idx].length() > avg_refs) ||
768 move_all) {
769 assert(to_idx < _num_q, "Sanity Check!");
770 if (ref_lists[to_idx].length() < avg_refs) {
771 // move superfluous refs
772 size_t refs_to_move;
773 // Move all the Ref's if the from queue will not be processed.
774 if (move_all) {
775 refs_to_move = MIN2(ref_lists[from_idx].length(),
776 avg_refs - ref_lists[to_idx].length());
777 } else {
778 refs_to_move = MIN2(ref_lists[from_idx].length() - avg_refs,
779 avg_refs - ref_lists[to_idx].length());
803 // Remove the chain from the from list.
804 if (move_tail == new_head) {
805 // We found the end of the from list.
806 ref_lists[from_idx].set_head(NULL);
807 } else {
808 ref_lists[from_idx].set_head(new_head);
809 }
810 ref_lists[from_idx].dec_length(refs_to_move);
811 if (ref_lists[from_idx].length() == 0) {
812 break;
813 }
814 } else {
815 to_idx = (to_idx + 1) % _num_q;
816 }
817 }
818 }
819 #ifdef ASSERT
820 size_t balanced_total_refs = 0;
821 for (uint i = 0; i < _max_num_q; ++i) {
822 balanced_total_refs += ref_lists[i].length();
823 if (TraceReferenceGC && PrintGCDetails) {
824 gclog_or_tty->print(SIZE_FORMAT " ", ref_lists[i].length());
825 }
826 }
827 if (TraceReferenceGC && PrintGCDetails) {
828 gclog_or_tty->print_cr(" = " SIZE_FORMAT, balanced_total_refs);
829 gclog_or_tty->flush();
830 }
831 assert(total_refs == balanced_total_refs, "Balancing was incomplete");
832 #endif
833 }
834
835 void ReferenceProcessor::balance_all_queues() {
836 balance_queues(_discoveredSoftRefs);
837 balance_queues(_discoveredWeakRefs);
838 balance_queues(_discoveredFinalRefs);
839 balance_queues(_discoveredPhantomRefs);
840 balance_queues(_discoveredCleanerRefs);
841 }
842
843 void ReferenceProcessor::process_discovered_reflist(
844 DiscoveredList refs_lists[],
845 ReferencePolicy* policy,
846 bool clear_referent,
847 BoolObjectClosure* is_alive,
848 OopClosure* keep_alive,
849 VoidClosure* complete_gc,
850 AbstractRefProcTaskExecutor* task_executor)
933 case REF_SOFT:
934 list = &_discoveredSoftRefs[id];
935 break;
936 case REF_WEAK:
937 list = &_discoveredWeakRefs[id];
938 break;
939 case REF_FINAL:
940 list = &_discoveredFinalRefs[id];
941 break;
942 case REF_PHANTOM:
943 list = &_discoveredPhantomRefs[id];
944 break;
945 case REF_CLEANER:
946 list = &_discoveredCleanerRefs[id];
947 break;
948 case REF_NONE:
949 // we should not reach here if we are an InstanceRefKlass
950 default:
951 ShouldNotReachHere();
952 }
953 if (TraceReferenceGC && PrintGCDetails) {
954 gclog_or_tty->print_cr("Thread %d gets list " INTPTR_FORMAT, id, p2i(list));
955 }
956 return list;
957 }
958
959 inline void
960 ReferenceProcessor::add_to_discovered_list_mt(DiscoveredList& refs_list,
961 oop obj,
962 HeapWord* discovered_addr) {
963 assert(_discovery_is_mt, "!_discovery_is_mt should have been handled by caller");
964 // First we must make sure this object is only enqueued once. CAS in a non null
965 // discovered_addr.
966 oop current_head = refs_list.head();
967 // The last ref must have its discovered field pointing to itself.
968 oop next_discovered = (current_head != NULL) ? current_head : obj;
969
970 oop retest = oopDesc::atomic_compare_exchange_oop(next_discovered, discovered_addr,
971 NULL);
972 if (retest == NULL) {
973 // This thread just won the right to enqueue the object.
974 // We have separate lists for enqueueing, so no synchronization
975 // is necessary.
976 refs_list.set_head(obj);
977 refs_list.inc_length(1);
978
979 if (TraceReferenceGC) {
980 gclog_or_tty->print_cr("Discovered reference (mt) (" INTPTR_FORMAT ": %s)",
981 p2i(obj), obj->klass()->internal_name());
982 }
983 } else {
984 // If retest was non NULL, another thread beat us to it:
985 // The reference has already been discovered...
986 if (TraceReferenceGC) {
987 gclog_or_tty->print_cr("Already discovered reference (" INTPTR_FORMAT ": %s)",
988 p2i(obj), obj->klass()->internal_name());
989 }
990 }
991 }
992
993 #ifndef PRODUCT
994 // Non-atomic (i.e. concurrent) discovery might allow us
995 // to observe j.l.References with NULL referents, being those
996 // cleared concurrently by mutators during (or after) discovery.
997 void ReferenceProcessor::verify_referent(oop obj) {
998 bool da = discovery_is_atomic();
999 oop referent = java_lang_ref_Reference::referent(obj);
1000 assert(da ? referent->is_oop() : referent->is_oop_or_null(),
1001 "Bad referent " INTPTR_FORMAT " found in Reference "
1002 INTPTR_FORMAT " during %satomic discovery ",
1003 p2i(referent), p2i(obj), da ? "" : "non-");
1004 }
1005 #endif
1006
1007 // We mention two of several possible choices here:
1008 // #0: if the reference object is not in the "originating generation"
1009 // (or part of the heap being collected, indicated by our "span"
1010 // we don't treat it specially (i.e. we scan it as we would
1011 // a normal oop, treating its references as strong references).
1061 if (rt == REF_SOFT) {
1062 // For soft refs we can decide now if these are not
1063 // current candidates for clearing, in which case we
1064 // can mark through them now, rather than delaying that
1065 // to the reference-processing phase. Since all current
1066 // time-stamp policies advance the soft-ref clock only
1067 // at a full collection cycle, this is always currently
1068 // accurate.
1069 if (!_current_soft_ref_policy->should_clear_reference(obj, _soft_ref_timestamp_clock)) {
1070 return false;
1071 }
1072 }
1073
1074 ResourceMark rm; // Needed for tracing.
1075
1076 HeapWord* const discovered_addr = java_lang_ref_Reference::discovered_addr(obj);
1077 const oop discovered = java_lang_ref_Reference::discovered(obj);
1078 assert(discovered->is_oop_or_null(), "Expected an oop or NULL for discovered field at " PTR_FORMAT, p2i(discovered));
1079 if (discovered != NULL) {
1080 // The reference has already been discovered...
1081 if (TraceReferenceGC) {
1082 gclog_or_tty->print_cr("Already discovered reference (" INTPTR_FORMAT ": %s)",
1083 p2i(obj), obj->klass()->internal_name());
1084 }
1085 if (RefDiscoveryPolicy == ReferentBasedDiscovery) {
1086 // assumes that an object is not processed twice;
1087 // if it's been already discovered it must be on another
1088 // generation's discovered list; so we won't discover it.
1089 return false;
1090 } else {
1091 assert(RefDiscoveryPolicy == ReferenceBasedDiscovery,
1092 "Unrecognized policy");
1093 // Check assumption that an object is not potentially
1094 // discovered twice except by concurrent collectors that potentially
1095 // trace the same Reference object twice.
1096 assert(UseConcMarkSweepGC || UseG1GC,
1097 "Only possible with a concurrent marking collector");
1098 return true;
1099 }
1100 }
1101
1102 if (RefDiscoveryPolicy == ReferentBasedDiscovery) {
1103 verify_referent(obj);
1104 // Discover if and only if EITHER:
1119 // Get the right type of discovered queue head.
1120 DiscoveredList* list = get_discovered_list(rt);
1121 if (list == NULL) {
1122 return false; // nothing special needs to be done
1123 }
1124
1125 if (_discovery_is_mt) {
1126 add_to_discovered_list_mt(*list, obj, discovered_addr);
1127 } else {
1128 // We do a raw store here: the field will be visited later when processing
1129 // the discovered references.
1130 oop current_head = list->head();
1131 // The last ref must have its discovered field pointing to itself.
1132 oop next_discovered = (current_head != NULL) ? current_head : obj;
1133
1134 assert(discovered == NULL, "control point invariant");
1135 oop_store_raw(discovered_addr, next_discovered);
1136 list->set_head(obj);
1137 list->inc_length(1);
1138
1139 if (TraceReferenceGC) {
1140 gclog_or_tty->print_cr("Discovered reference (" INTPTR_FORMAT ": %s)",
1141 p2i(obj), obj->klass()->internal_name());
1142 }
1143 }
1144 assert(obj->is_oop(), "Discovered a bad reference");
1145 verify_referent(obj);
1146 return true;
1147 }
1148
1149 // Preclean the discovered references by removing those
1150 // whose referents are alive, and by marking from those that
1151 // are not active. These lists can be handled here
1152 // in any order and, indeed, concurrently.
1153 void ReferenceProcessor::preclean_discovered_references(
1154 BoolObjectClosure* is_alive,
1155 OopClosure* keep_alive,
1156 VoidClosure* complete_gc,
1157 YieldClosure* yield,
1158 GCTimer* gc_timer) {
1159
1160 // Soft references
1161 {
1162 GCTraceTime tt("Preclean SoftReferences", PrintGCDetails && PrintReferenceGC,
1163 false, gc_timer);
1164 for (uint i = 0; i < _max_num_q; i++) {
1165 if (yield->should_return()) {
1166 return;
1167 }
1168 preclean_discovered_reflist(_discoveredSoftRefs[i], is_alive,
1169 keep_alive, complete_gc, yield);
1170 }
1171 }
1172
1173 // Weak references
1174 {
1175 GCTraceTime tt("Preclean WeakReferences", PrintGCDetails && PrintReferenceGC,
1176 false, gc_timer);
1177 for (uint i = 0; i < _max_num_q; i++) {
1178 if (yield->should_return()) {
1179 return;
1180 }
1181 preclean_discovered_reflist(_discoveredWeakRefs[i], is_alive,
1182 keep_alive, complete_gc, yield);
1183 }
1184 }
1185
1186 // Final references
1187 {
1188 GCTraceTime tt("Preclean FinalReferences", PrintGCDetails && PrintReferenceGC,
1189 false, gc_timer);
1190 for (uint i = 0; i < _max_num_q; i++) {
1191 if (yield->should_return()) {
1192 return;
1193 }
1194 preclean_discovered_reflist(_discoveredFinalRefs[i], is_alive,
1195 keep_alive, complete_gc, yield);
1196 }
1197 }
1198
1199 // Phantom references
1200 {
1201 GCTraceTime tt("Preclean PhantomReferences", PrintGCDetails && PrintReferenceGC,
1202 false, gc_timer);
1203 for (uint i = 0; i < _max_num_q; i++) {
1204 if (yield->should_return()) {
1205 return;
1206 }
1207 preclean_discovered_reflist(_discoveredPhantomRefs[i], is_alive,
1208 keep_alive, complete_gc, yield);
1209 }
1210
1211 // Cleaner references. Included in timing for phantom references. We
1212 // expect Cleaner references to be temporary, and don't want to deal with
1213 // possible incompatibilities arising from making it more visible.
1214 for (uint i = 0; i < _max_num_q; i++) {
1215 if (yield->should_return()) {
1216 return;
1217 }
1218 preclean_discovered_reflist(_discoveredCleanerRefs[i], is_alive,
1219 keep_alive, complete_gc, yield);
1220 }
1221 }
1222 }
1227 // thus precleaning the ref lists (which happens single-threaded today),
1228 // we do not disable refs discovery to honor the correct semantics of
1229 // java.lang.Reference. As a result, we need to be careful below
1230 // that ref removal steps interleave safely with ref discovery steps
1231 // (in this thread).
1232 void
1233 ReferenceProcessor::preclean_discovered_reflist(DiscoveredList& refs_list,
1234 BoolObjectClosure* is_alive,
1235 OopClosure* keep_alive,
1236 VoidClosure* complete_gc,
1237 YieldClosure* yield) {
1238 DiscoveredListIterator iter(refs_list, keep_alive, is_alive);
1239 while (iter.has_next()) {
1240 iter.load_ptrs(DEBUG_ONLY(true /* allow_null_referent */));
1241 oop obj = iter.obj();
1242 oop next = java_lang_ref_Reference::next(obj);
1243 if (iter.referent() == NULL || iter.is_referent_alive() ||
1244 next != NULL) {
1245 // The referent has been cleared, or is alive, or the Reference is not
1246 // active; we need to trace and mark its cohort.
1247 if (TraceReferenceGC) {
1248 gclog_or_tty->print_cr("Precleaning Reference (" INTPTR_FORMAT ": %s)",
1249 p2i(iter.obj()), iter.obj()->klass()->internal_name());
1250 }
1251 // Remove Reference object from list
1252 iter.remove();
1253 // Keep alive its cohort.
1254 iter.make_referent_alive();
1255 if (UseCompressedOops) {
1256 narrowOop* next_addr = (narrowOop*)java_lang_ref_Reference::next_addr(obj);
1257 keep_alive->do_oop(next_addr);
1258 } else {
1259 oop* next_addr = (oop*)java_lang_ref_Reference::next_addr(obj);
1260 keep_alive->do_oop(next_addr);
1261 }
1262 iter.move_to_next();
1263 } else {
1264 iter.next();
1265 }
1266 }
1267 // Close the reachable set
1268 complete_gc->do_void();
1269
1270 NOT_PRODUCT(
1271 if (PrintGCDetails && PrintReferenceGC && (iter.processed() > 0)) {
1272 gclog_or_tty->print_cr(" Dropped " SIZE_FORMAT " Refs out of " SIZE_FORMAT
1273 " Refs in discovered list " INTPTR_FORMAT,
1274 iter.removed(), iter.processed(), p2i(refs_list.head()));
1275 }
1276 )
1277 }
1278
1279 const char* ReferenceProcessor::list_name(uint i) {
1280 assert(i <= _max_num_q * number_of_subclasses_of_ref(),
1281 "Out of bounds index");
1282
1283 int j = i / _max_num_q;
1284 switch (j) {
1285 case 0: return "SoftRef";
1286 case 1: return "WeakRef";
1287 case 2: return "FinalRef";
1288 case 3: return "PhantomRef";
1289 case 4: return "CleanerRef";
1290 }
1291 ShouldNotReachHere();
1292 return NULL;
1293 }
|
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 #include "precompiled.hpp"
26 #include "classfile/javaClasses.hpp"
27 #include "classfile/systemDictionary.hpp"
28 #include "gc/shared/collectedHeap.hpp"
29 #include "gc/shared/collectedHeap.inline.hpp"
30 #include "gc/shared/gcTimer.hpp"
31 #include "gc/shared/gcTraceTime.inline.hpp"
32 #include "gc/shared/referencePolicy.hpp"
33 #include "gc/shared/referenceProcessor.hpp"
34 #include "logging/log.hpp"
35 #include "memory/allocation.hpp"
36 #include "oops/oop.inline.hpp"
37 #include "runtime/java.hpp"
38 #include "runtime/jniHandles.hpp"
39
40 ReferencePolicy* ReferenceProcessor::_always_clear_soft_ref_policy = NULL;
41 ReferencePolicy* ReferenceProcessor::_default_soft_ref_policy = NULL;
42 jlong ReferenceProcessor::_soft_ref_timestamp_clock = 0;
43
44 void referenceProcessor_init() {
45 ReferenceProcessor::init_statics();
46 }
47
48 void ReferenceProcessor::init_statics() {
49 // We need a monotonically non-decreasing time in ms but
50 // os::javaTimeMillis() does not guarantee monotonicity.
51 jlong now = os::javaTimeNanos() / NANOSECS_PER_MILLISEC;
52
53 // Initialize the soft ref timestamp clock.
54 _soft_ref_timestamp_clock = now;
170 // javaTimeNanos(), which is guaranteed to be monotonically
171 // non-decreasing provided the underlying platform provides such
172 // a time source (and it is bug free).
173 // In product mode, however, protect ourselves from non-monotonicity.
174 if (now > _soft_ref_timestamp_clock) {
175 _soft_ref_timestamp_clock = now;
176 java_lang_ref_SoftReference::set_clock(now);
177 }
178 // Else leave clock stalled at its old value until time progresses
179 // past clock value.
180 }
181
182 size_t ReferenceProcessor::total_count(DiscoveredList lists[]) {
183 size_t total = 0;
184 for (uint i = 0; i < _max_num_q; ++i) {
185 total += lists[i].length();
186 }
187 return total;
188 }
189
190 ReferenceProcessorStats ReferenceProcessor::process_discovered_references(
191 BoolObjectClosure* is_alive,
192 OopClosure* keep_alive,
193 VoidClosure* complete_gc,
194 AbstractRefProcTaskExecutor* task_executor,
195 GCTimer* gc_timer) {
196
197 assert(!enqueuing_is_done(), "If here enqueuing should not be complete");
198 // Stop treating discovered references specially.
199 disable_discovery();
200
201 // If discovery was concurrent, someone could have modified
202 // the value of the static field in the j.l.r.SoftReference
203 // class that holds the soft reference timestamp clock using
204 // reflection or Unsafe between when discovery was enabled and
205 // now. Unconditionally update the static field in ReferenceProcessor
206 // here so that we use the new value during processing of the
207 // discovered soft refs.
208
209 _soft_ref_timestamp_clock = java_lang_ref_SoftReference::clock();
210
211 // Include cleaners in phantom statistics. We expect Cleaner
212 // references to be temporary, and don't want to deal with
213 // possible incompatibilities arising from making it more visible.
214 ReferenceProcessorStats stats(
215 total_count(_discoveredSoftRefs),
216 total_count(_discoveredWeakRefs),
217 total_count(_discoveredFinalRefs),
218 total_count(_discoveredPhantomRefs) + total_count(_discoveredCleanerRefs));
219
220 // Soft references
221 {
222 GCTraceTime(Debug, gc, ref) tt("SoftReference", gc_timer);
223 process_discovered_reflist(_discoveredSoftRefs, _current_soft_ref_policy, true,
224 is_alive, keep_alive, complete_gc, task_executor);
225 }
226
227 update_soft_ref_master_clock();
228
229 // Weak references
230 {
231 GCTraceTime(Debug, gc, ref) tt("WeakReference", gc_timer);
232 process_discovered_reflist(_discoveredWeakRefs, NULL, true,
233 is_alive, keep_alive, complete_gc, task_executor);
234 }
235
236 // Final references
237 {
238 GCTraceTime(Debug, gc, ref) tt("FinalReference", gc_timer);
239 process_discovered_reflist(_discoveredFinalRefs, NULL, false,
240 is_alive, keep_alive, complete_gc, task_executor);
241 }
242
243 // Phantom references
244 {
245 GCTraceTime(Debug, gc, ref) tt("PhantomReference", gc_timer);
246 process_discovered_reflist(_discoveredPhantomRefs, NULL, false,
247 is_alive, keep_alive, complete_gc, task_executor);
248
249 // Process cleaners, but include them in phantom timing. We expect
250 // Cleaner references to be temporary, and don't want to deal with
251 // possible incompatibilities arising from making it more visible.
252 process_discovered_reflist(_discoveredCleanerRefs, NULL, true,
253 is_alive, keep_alive, complete_gc, task_executor);
254 }
255
256 // Weak global JNI references. It would make more sense (semantically) to
257 // traverse these simultaneously with the regular weak references above, but
258 // that is not how the JDK1.2 specification is. See #4126360. Native code can
259 // thus use JNI weak references to circumvent the phantom references and
260 // resurrect a "post-mortem" object.
261 {
262 GCTraceTime(Debug, gc, ref) tt("JNI Weak Reference", gc_timer);
263 if (task_executor != NULL) {
264 task_executor->set_single_threaded_mode();
265 }
266 process_phaseJNI(is_alive, keep_alive, complete_gc);
267 }
268
269 log_debug(gc, ref)("Ref Counts: Soft: " SIZE_FORMAT " Weak: " SIZE_FORMAT " Final: " SIZE_FORMAT " Phantom: " SIZE_FORMAT,
270 stats.soft_count(), stats.weak_count(), stats.final_count(), stats.phantom_count());
271 log_develop_trace(gc, ref)("JNI Weak Reference count: " SIZE_FORMAT, count_jni_refs());
272
273 return stats;
274 }
275
276 #ifndef PRODUCT
277 // Calculate the number of jni handles.
278 size_t ReferenceProcessor::count_jni_refs() {
279 class AlwaysAliveClosure: public BoolObjectClosure {
280 public:
281 virtual bool do_object_b(oop obj) { return true; }
282 };
283
284 class CountHandleClosure: public OopClosure {
285 private:
286 size_t _count;
287 public:
288 CountHandleClosure(): _count(0) {}
289 void do_oop(oop* unused) { _count++; }
290 void do_oop(narrowOop* unused) { ShouldNotReachHere(); }
291 size_t count() { return _count; }
292 };
293 CountHandleClosure global_handle_count;
294 AlwaysAliveClosure always_alive;
295 JNIHandles::weak_oops_do(&always_alive, &global_handle_count);
296 return global_handle_count.count();
297 }
298 #endif
299
300 void ReferenceProcessor::process_phaseJNI(BoolObjectClosure* is_alive,
301 OopClosure* keep_alive,
302 VoidClosure* complete_gc) {
303 JNIHandles::weak_oops_do(is_alive, keep_alive);
304 complete_gc->do_void();
305 }
306
307
308 template <class T>
309 bool enqueue_discovered_ref_helper(ReferenceProcessor* ref,
310 AbstractRefProcTaskExecutor* task_executor) {
311
332 return enqueue_discovered_ref_helper<narrowOop>(this, task_executor);
333 } else {
334 return enqueue_discovered_ref_helper<oop>(this, task_executor);
335 }
336 }
337
338 void ReferenceProcessor::enqueue_discovered_reflist(DiscoveredList& refs_list,
339 HeapWord* pending_list_addr) {
340 // Given a list of refs linked through the "discovered" field
341 // (java.lang.ref.Reference.discovered), self-loop their "next" field
342 // thus distinguishing them from active References, then
343 // prepend them to the pending list.
344 //
345 // The Java threads will see the Reference objects linked together through
346 // the discovered field. Instead of trying to do the write barrier updates
347 // in all places in the reference processor where we manipulate the discovered
348 // field we make sure to do the barrier here where we anyway iterate through
349 // all linked Reference objects. Note that it is important to not dirty any
350 // cards during reference processing since this will cause card table
351 // verification to fail for G1.
352 log_develop_trace(gc, ref)("ReferenceProcessor::enqueue_discovered_reflist list " INTPTR_FORMAT, p2i(refs_list.head()));
353
354 oop obj = NULL;
355 oop next_d = refs_list.head();
356 // Walk down the list, self-looping the next field
357 // so that the References are not considered active.
358 while (obj != next_d) {
359 obj = next_d;
360 assert(obj->is_instance(), "should be an instance object");
361 assert(InstanceKlass::cast(obj->klass())->is_reference_instance_klass(), "should be reference object");
362 next_d = java_lang_ref_Reference::discovered(obj);
363 log_develop_trace(gc, ref)(" obj " INTPTR_FORMAT "/next_d " INTPTR_FORMAT, p2i(obj), p2i(next_d));
364 assert(java_lang_ref_Reference::next(obj) == NULL,
365 "Reference not active; should not be discovered");
366 // Self-loop next, so as to make Ref not active.
367 java_lang_ref_Reference::set_next_raw(obj, obj);
368 if (next_d != obj) {
369 oopDesc::bs()->write_ref_field(java_lang_ref_Reference::discovered_addr(obj), next_d);
370 } else {
371 // This is the last object.
372 // Swap refs_list into pending_list_addr and
373 // set obj's discovered to what we read from pending_list_addr.
374 oop old = oopDesc::atomic_exchange_oop(refs_list.head(), pending_list_addr);
375 // Need post-barrier on pending_list_addr. See enqueue_discovered_ref_helper() above.
376 java_lang_ref_Reference::set_discovered_raw(obj, old); // old may be NULL
377 oopDesc::bs()->write_ref_field(java_lang_ref_Reference::discovered_addr(obj), old);
378 }
379 }
380 }
381
382 // Parallel enqueue task
383 class RefProcEnqueueTask: public AbstractRefProcTaskExecutor::EnqueueTask {
481 // a single general iterator invocation that receives appropriate
482 // closures that accomplish this work.
483
484 // (SoftReferences only) Traverse the list and remove any SoftReferences whose
485 // referents are not alive, but that should be kept alive for policy reasons.
486 // Keep alive the transitive closure of all such referents.
487 void
488 ReferenceProcessor::process_phase1(DiscoveredList& refs_list,
489 ReferencePolicy* policy,
490 BoolObjectClosure* is_alive,
491 OopClosure* keep_alive,
492 VoidClosure* complete_gc) {
493 assert(policy != NULL, "Must have a non-NULL policy");
494 DiscoveredListIterator iter(refs_list, keep_alive, is_alive);
495 // Decide which softly reachable refs should be kept alive.
496 while (iter.has_next()) {
497 iter.load_ptrs(DEBUG_ONLY(!discovery_is_atomic() /* allow_null_referent */));
498 bool referent_is_dead = (iter.referent() != NULL) && !iter.is_referent_alive();
499 if (referent_is_dead &&
500 !policy->should_clear_reference(iter.obj(), _soft_ref_timestamp_clock)) {
501 log_develop_trace(gc, ref)("Dropping reference (" INTPTR_FORMAT ": %s" ") by policy",
502 p2i(iter.obj()), iter.obj()->klass()->internal_name());
503 // Remove Reference object from list
504 iter.remove();
505 // keep the referent around
506 iter.make_referent_alive();
507 iter.move_to_next();
508 } else {
509 iter.next();
510 }
511 }
512 // Close the reachable set
513 complete_gc->do_void();
514 log_develop_trace(gc, ref)(" Dropped " SIZE_FORMAT " dead Refs out of " SIZE_FORMAT " discovered Refs by policy, from list " INTPTR_FORMAT,
515 iter.removed(), iter.processed(), p2i(refs_list.head()));
516 }
517
518 // Traverse the list and remove any Refs that are not active, or
519 // whose referents are either alive or NULL.
520 void
521 ReferenceProcessor::pp2_work(DiscoveredList& refs_list,
522 BoolObjectClosure* is_alive,
523 OopClosure* keep_alive) {
524 assert(discovery_is_atomic(), "Error");
525 DiscoveredListIterator iter(refs_list, keep_alive, is_alive);
526 while (iter.has_next()) {
527 iter.load_ptrs(DEBUG_ONLY(false /* allow_null_referent */));
528 DEBUG_ONLY(oop next = java_lang_ref_Reference::next(iter.obj());)
529 assert(next == NULL, "Should not discover inactive Reference");
530 if (iter.is_referent_alive()) {
531 log_develop_trace(gc, ref)("Dropping strongly reachable reference (" INTPTR_FORMAT ": %s)",
532 p2i(iter.obj()), iter.obj()->klass()->internal_name());
533 // The referent is reachable after all.
534 // Remove Reference object from list.
535 iter.remove();
536 // Update the referent pointer as necessary: Note that this
537 // should not entail any recursive marking because the
538 // referent must already have been traversed.
539 iter.make_referent_alive();
540 iter.move_to_next();
541 } else {
542 iter.next();
543 }
544 }
545 NOT_PRODUCT(
546 if (iter.processed() > 0) {
547 log_develop_trace(gc, ref)(" Dropped " SIZE_FORMAT " active Refs out of " SIZE_FORMAT
548 " Refs in discovered list " INTPTR_FORMAT,
549 iter.removed(), iter.processed(), p2i(refs_list.head()));
550 }
551 )
552 }
553
554 void
555 ReferenceProcessor::pp2_work_concurrent_discovery(DiscoveredList& refs_list,
556 BoolObjectClosure* is_alive,
557 OopClosure* keep_alive,
558 VoidClosure* complete_gc) {
559 assert(!discovery_is_atomic(), "Error");
560 DiscoveredListIterator iter(refs_list, keep_alive, is_alive);
561 while (iter.has_next()) {
562 iter.load_ptrs(DEBUG_ONLY(true /* allow_null_referent */));
563 HeapWord* next_addr = java_lang_ref_Reference::next_addr(iter.obj());
564 oop next = java_lang_ref_Reference::next(iter.obj());
565 if ((iter.referent() == NULL || iter.is_referent_alive() ||
566 next != NULL)) {
567 assert(next->is_oop_or_null(), "Expected an oop or NULL for next field at " PTR_FORMAT, p2i(next));
568 // Remove Reference object from list
569 iter.remove();
570 // Trace the cohorts
571 iter.make_referent_alive();
572 if (UseCompressedOops) {
573 keep_alive->do_oop((narrowOop*)next_addr);
574 } else {
575 keep_alive->do_oop((oop*)next_addr);
576 }
577 iter.move_to_next();
578 } else {
579 iter.next();
580 }
581 }
582 // Now close the newly reachable set
583 complete_gc->do_void();
584 NOT_PRODUCT(
585 if (iter.processed() > 0) {
586 log_develop_trace(gc, ref)(" Dropped " SIZE_FORMAT " active Refs out of " SIZE_FORMAT
587 " Refs in discovered list " INTPTR_FORMAT,
588 iter.removed(), iter.processed(), p2i(refs_list.head()));
589 }
590 )
591 }
592
593 // Traverse the list and process the referents, by either
594 // clearing them or keeping them (and their reachable
595 // closure) alive.
596 void
597 ReferenceProcessor::process_phase3(DiscoveredList& refs_list,
598 bool clear_referent,
599 BoolObjectClosure* is_alive,
600 OopClosure* keep_alive,
601 VoidClosure* complete_gc) {
602 ResourceMark rm;
603 DiscoveredListIterator iter(refs_list, keep_alive, is_alive);
604 while (iter.has_next()) {
605 iter.load_ptrs(DEBUG_ONLY(false /* allow_null_referent */));
606 if (clear_referent) {
607 // NULL out referent pointer
608 iter.clear_referent();
609 } else {
610 // keep the referent around
611 iter.make_referent_alive();
612 }
613 log_develop_trace(gc, ref)("Adding %sreference (" INTPTR_FORMAT ": %s) as pending",
614 clear_referent ? "cleared " : "", p2i(iter.obj()), iter.obj()->klass()->internal_name());
615 assert(iter.obj()->is_oop(UseConcMarkSweepGC), "Adding a bad reference");
616 iter.next();
617 }
618 // Close the reachable set
619 complete_gc->do_void();
620 }
621
622 void
623 ReferenceProcessor::clear_discovered_references(DiscoveredList& refs_list) {
624 oop obj = NULL;
625 oop next = refs_list.head();
626 while (next != obj) {
627 obj = next;
628 next = java_lang_ref_Reference::discovered(obj);
629 java_lang_ref_Reference::set_discovered_raw(obj, NULL);
630 }
631 refs_list.set_head(NULL);
632 refs_list.set_length(0);
633 }
634
635 void ReferenceProcessor::abandon_partial_discovery() {
636 // loop over the lists
637 for (uint i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) {
638 if ((i % _max_num_q) == 0) {
639 log_develop_trace(gc, ref)("Abandoning %s discovered list", list_name(i));
640 }
641 clear_discovered_references(_discovered_refs[i]);
642 }
643 }
644
645 class RefProcPhase1Task: public AbstractRefProcTaskExecutor::ProcessTask {
646 public:
647 RefProcPhase1Task(ReferenceProcessor& ref_processor,
648 DiscoveredList refs_lists[],
649 ReferencePolicy* policy,
650 bool marks_oops_alive)
651 : ProcessTask(ref_processor, refs_lists, marks_oops_alive),
652 _policy(policy)
653 { }
654 virtual void work(unsigned int i, BoolObjectClosure& is_alive,
655 OopClosure& keep_alive,
656 VoidClosure& complete_gc)
657 {
658 Thread* thr = Thread::current();
659 int refs_list_index = ((WorkerThread*)thr)->id();
688 bool marks_oops_alive)
689 : ProcessTask(ref_processor, refs_lists, marks_oops_alive),
690 _clear_referent(clear_referent)
691 { }
692 virtual void work(unsigned int i, BoolObjectClosure& is_alive,
693 OopClosure& keep_alive,
694 VoidClosure& complete_gc)
695 {
696 // Don't use "refs_list_index" calculated in this way because
697 // balance_queues() has moved the Ref's into the first n queues.
698 // Thread* thr = Thread::current();
699 // int refs_list_index = ((WorkerThread*)thr)->id();
700 // _ref_processor.process_phase3(_refs_lists[refs_list_index], _clear_referent,
701 _ref_processor.process_phase3(_refs_lists[i], _clear_referent,
702 &is_alive, &keep_alive, &complete_gc);
703 }
704 private:
705 bool _clear_referent;
706 };
707
708 #ifndef PRODUCT
709 void ReferenceProcessor::log_reflist_counts(DiscoveredList ref_lists[], size_t total_refs) {
710 if (!log_is_enabled(Trace, gc, ref)) {
711 return;
712 }
713
714 stringStream st;
715 for (uint i = 0; i < _max_num_q; ++i) {
716 st.print(SIZE_FORMAT " ", ref_lists[i].length());
717 }
718 log_develop_trace(gc, ref)("%s= " SIZE_FORMAT, st.as_string(), total_refs);
719 }
720 #endif
721
722 // Balances reference queues.
723 // Move entries from all queues[0, 1, ..., _max_num_q-1] to
724 // queues[0, 1, ..., _num_q-1] because only the first _num_q
725 // corresponding to the active workers will be processed.
726 void ReferenceProcessor::balance_queues(DiscoveredList ref_lists[])
727 {
728 // calculate total length
729 size_t total_refs = 0;
730 log_develop_trace(gc, ref)("Balance ref_lists ");
731
732 for (uint i = 0; i < _max_num_q; ++i) {
733 total_refs += ref_lists[i].length();
734 }
735 log_reflist_counts(ref_lists, total_refs);
736 size_t avg_refs = total_refs / _num_q + 1;
737 uint to_idx = 0;
738 for (uint from_idx = 0; from_idx < _max_num_q; from_idx++) {
739 bool move_all = false;
740 if (from_idx >= _num_q) {
741 move_all = ref_lists[from_idx].length() > 0;
742 }
743 while ((ref_lists[from_idx].length() > avg_refs) ||
744 move_all) {
745 assert(to_idx < _num_q, "Sanity Check!");
746 if (ref_lists[to_idx].length() < avg_refs) {
747 // move superfluous refs
748 size_t refs_to_move;
749 // Move all the Ref's if the from queue will not be processed.
750 if (move_all) {
751 refs_to_move = MIN2(ref_lists[from_idx].length(),
752 avg_refs - ref_lists[to_idx].length());
753 } else {
754 refs_to_move = MIN2(ref_lists[from_idx].length() - avg_refs,
755 avg_refs - ref_lists[to_idx].length());
779 // Remove the chain from the from list.
780 if (move_tail == new_head) {
781 // We found the end of the from list.
782 ref_lists[from_idx].set_head(NULL);
783 } else {
784 ref_lists[from_idx].set_head(new_head);
785 }
786 ref_lists[from_idx].dec_length(refs_to_move);
787 if (ref_lists[from_idx].length() == 0) {
788 break;
789 }
790 } else {
791 to_idx = (to_idx + 1) % _num_q;
792 }
793 }
794 }
795 #ifdef ASSERT
796 size_t balanced_total_refs = 0;
797 for (uint i = 0; i < _max_num_q; ++i) {
798 balanced_total_refs += ref_lists[i].length();
799 }
800 log_reflist_counts(ref_lists, balanced_total_refs);
801 assert(total_refs == balanced_total_refs, "Balancing was incomplete");
802 #endif
803 }
804
805 void ReferenceProcessor::balance_all_queues() {
806 balance_queues(_discoveredSoftRefs);
807 balance_queues(_discoveredWeakRefs);
808 balance_queues(_discoveredFinalRefs);
809 balance_queues(_discoveredPhantomRefs);
810 balance_queues(_discoveredCleanerRefs);
811 }
812
813 void ReferenceProcessor::process_discovered_reflist(
814 DiscoveredList refs_lists[],
815 ReferencePolicy* policy,
816 bool clear_referent,
817 BoolObjectClosure* is_alive,
818 OopClosure* keep_alive,
819 VoidClosure* complete_gc,
820 AbstractRefProcTaskExecutor* task_executor)
903 case REF_SOFT:
904 list = &_discoveredSoftRefs[id];
905 break;
906 case REF_WEAK:
907 list = &_discoveredWeakRefs[id];
908 break;
909 case REF_FINAL:
910 list = &_discoveredFinalRefs[id];
911 break;
912 case REF_PHANTOM:
913 list = &_discoveredPhantomRefs[id];
914 break;
915 case REF_CLEANER:
916 list = &_discoveredCleanerRefs[id];
917 break;
918 case REF_NONE:
919 // we should not reach here if we are an InstanceRefKlass
920 default:
921 ShouldNotReachHere();
922 }
923 log_develop_trace(gc, ref)("Thread %d gets list " INTPTR_FORMAT, id, p2i(list));
924 return list;
925 }
926
927 inline void
928 ReferenceProcessor::add_to_discovered_list_mt(DiscoveredList& refs_list,
929 oop obj,
930 HeapWord* discovered_addr) {
931 assert(_discovery_is_mt, "!_discovery_is_mt should have been handled by caller");
932 // First we must make sure this object is only enqueued once. CAS in a non null
933 // discovered_addr.
934 oop current_head = refs_list.head();
935 // The last ref must have its discovered field pointing to itself.
936 oop next_discovered = (current_head != NULL) ? current_head : obj;
937
938 oop retest = oopDesc::atomic_compare_exchange_oop(next_discovered, discovered_addr,
939 NULL);
940 if (retest == NULL) {
941 // This thread just won the right to enqueue the object.
942 // We have separate lists for enqueueing, so no synchronization
943 // is necessary.
944 refs_list.set_head(obj);
945 refs_list.inc_length(1);
946
947 log_develop_trace(gc, ref)("Discovered reference (mt) (" INTPTR_FORMAT ": %s)",
948 p2i(obj), obj->klass()->internal_name());
949 } else {
950 // If retest was non NULL, another thread beat us to it:
951 // The reference has already been discovered...
952 log_develop_trace(gc, ref)("Already discovered reference (" INTPTR_FORMAT ": %s)",
953 p2i(obj), obj->klass()->internal_name());
954 }
955 }
956
957 #ifndef PRODUCT
958 // Non-atomic (i.e. concurrent) discovery might allow us
959 // to observe j.l.References with NULL referents, being those
960 // cleared concurrently by mutators during (or after) discovery.
961 void ReferenceProcessor::verify_referent(oop obj) {
962 bool da = discovery_is_atomic();
963 oop referent = java_lang_ref_Reference::referent(obj);
964 assert(da ? referent->is_oop() : referent->is_oop_or_null(),
965 "Bad referent " INTPTR_FORMAT " found in Reference "
966 INTPTR_FORMAT " during %satomic discovery ",
967 p2i(referent), p2i(obj), da ? "" : "non-");
968 }
969 #endif
970
971 // We mention two of several possible choices here:
972 // #0: if the reference object is not in the "originating generation"
973 // (or part of the heap being collected, indicated by our "span"
974 // we don't treat it specially (i.e. we scan it as we would
975 // a normal oop, treating its references as strong references).
1025 if (rt == REF_SOFT) {
1026 // For soft refs we can decide now if these are not
1027 // current candidates for clearing, in which case we
1028 // can mark through them now, rather than delaying that
1029 // to the reference-processing phase. Since all current
1030 // time-stamp policies advance the soft-ref clock only
1031 // at a full collection cycle, this is always currently
1032 // accurate.
1033 if (!_current_soft_ref_policy->should_clear_reference(obj, _soft_ref_timestamp_clock)) {
1034 return false;
1035 }
1036 }
1037
1038 ResourceMark rm; // Needed for tracing.
1039
1040 HeapWord* const discovered_addr = java_lang_ref_Reference::discovered_addr(obj);
1041 const oop discovered = java_lang_ref_Reference::discovered(obj);
1042 assert(discovered->is_oop_or_null(), "Expected an oop or NULL for discovered field at " PTR_FORMAT, p2i(discovered));
1043 if (discovered != NULL) {
1044 // The reference has already been discovered...
1045 log_develop_trace(gc, ref)("Already discovered reference (" INTPTR_FORMAT ": %s)",
1046 p2i(obj), obj->klass()->internal_name());
1047 if (RefDiscoveryPolicy == ReferentBasedDiscovery) {
1048 // assumes that an object is not processed twice;
1049 // if it's been already discovered it must be on another
1050 // generation's discovered list; so we won't discover it.
1051 return false;
1052 } else {
1053 assert(RefDiscoveryPolicy == ReferenceBasedDiscovery,
1054 "Unrecognized policy");
1055 // Check assumption that an object is not potentially
1056 // discovered twice except by concurrent collectors that potentially
1057 // trace the same Reference object twice.
1058 assert(UseConcMarkSweepGC || UseG1GC,
1059 "Only possible with a concurrent marking collector");
1060 return true;
1061 }
1062 }
1063
1064 if (RefDiscoveryPolicy == ReferentBasedDiscovery) {
1065 verify_referent(obj);
1066 // Discover if and only if EITHER:
1081 // Get the right type of discovered queue head.
1082 DiscoveredList* list = get_discovered_list(rt);
1083 if (list == NULL) {
1084 return false; // nothing special needs to be done
1085 }
1086
1087 if (_discovery_is_mt) {
1088 add_to_discovered_list_mt(*list, obj, discovered_addr);
1089 } else {
1090 // We do a raw store here: the field will be visited later when processing
1091 // the discovered references.
1092 oop current_head = list->head();
1093 // The last ref must have its discovered field pointing to itself.
1094 oop next_discovered = (current_head != NULL) ? current_head : obj;
1095
1096 assert(discovered == NULL, "control point invariant");
1097 oop_store_raw(discovered_addr, next_discovered);
1098 list->set_head(obj);
1099 list->inc_length(1);
1100
1101 log_develop_trace(gc, ref)("Discovered reference (" INTPTR_FORMAT ": %s)", p2i(obj), obj->klass()->internal_name());
1102 }
1103 assert(obj->is_oop(), "Discovered a bad reference");
1104 verify_referent(obj);
1105 return true;
1106 }
1107
1108 // Preclean the discovered references by removing those
1109 // whose referents are alive, and by marking from those that
1110 // are not active. These lists can be handled here
1111 // in any order and, indeed, concurrently.
1112 void ReferenceProcessor::preclean_discovered_references(
1113 BoolObjectClosure* is_alive,
1114 OopClosure* keep_alive,
1115 VoidClosure* complete_gc,
1116 YieldClosure* yield,
1117 GCTimer* gc_timer) {
1118
1119 // Soft references
1120 {
1121 GCTraceTime(Debug, gc, ref) tm("Preclean SoftReferences", gc_timer);
1122 for (uint i = 0; i < _max_num_q; i++) {
1123 if (yield->should_return()) {
1124 return;
1125 }
1126 preclean_discovered_reflist(_discoveredSoftRefs[i], is_alive,
1127 keep_alive, complete_gc, yield);
1128 }
1129 }
1130
1131 // Weak references
1132 {
1133 GCTraceTime(Debug, gc, ref) tm("Preclean WeakReferences", gc_timer);
1134 for (uint i = 0; i < _max_num_q; i++) {
1135 if (yield->should_return()) {
1136 return;
1137 }
1138 preclean_discovered_reflist(_discoveredWeakRefs[i], is_alive,
1139 keep_alive, complete_gc, yield);
1140 }
1141 }
1142
1143 // Final references
1144 {
1145 GCTraceTime(Debug, gc, ref) tm("Preclean FinalReferences", gc_timer);
1146 for (uint i = 0; i < _max_num_q; i++) {
1147 if (yield->should_return()) {
1148 return;
1149 }
1150 preclean_discovered_reflist(_discoveredFinalRefs[i], is_alive,
1151 keep_alive, complete_gc, yield);
1152 }
1153 }
1154
1155 // Phantom references
1156 {
1157 GCTraceTime(Debug, gc, ref) tm("Preclean PhantomReferences", gc_timer);
1158 for (uint i = 0; i < _max_num_q; i++) {
1159 if (yield->should_return()) {
1160 return;
1161 }
1162 preclean_discovered_reflist(_discoveredPhantomRefs[i], is_alive,
1163 keep_alive, complete_gc, yield);
1164 }
1165
1166 // Cleaner references. Included in timing for phantom references. We
1167 // expect Cleaner references to be temporary, and don't want to deal with
1168 // possible incompatibilities arising from making it more visible.
1169 for (uint i = 0; i < _max_num_q; i++) {
1170 if (yield->should_return()) {
1171 return;
1172 }
1173 preclean_discovered_reflist(_discoveredCleanerRefs[i], is_alive,
1174 keep_alive, complete_gc, yield);
1175 }
1176 }
1177 }
1182 // thus precleaning the ref lists (which happens single-threaded today),
1183 // we do not disable refs discovery to honor the correct semantics of
1184 // java.lang.Reference. As a result, we need to be careful below
1185 // that ref removal steps interleave safely with ref discovery steps
1186 // (in this thread).
1187 void
1188 ReferenceProcessor::preclean_discovered_reflist(DiscoveredList& refs_list,
1189 BoolObjectClosure* is_alive,
1190 OopClosure* keep_alive,
1191 VoidClosure* complete_gc,
1192 YieldClosure* yield) {
1193 DiscoveredListIterator iter(refs_list, keep_alive, is_alive);
1194 while (iter.has_next()) {
1195 iter.load_ptrs(DEBUG_ONLY(true /* allow_null_referent */));
1196 oop obj = iter.obj();
1197 oop next = java_lang_ref_Reference::next(obj);
1198 if (iter.referent() == NULL || iter.is_referent_alive() ||
1199 next != NULL) {
1200 // The referent has been cleared, or is alive, or the Reference is not
1201 // active; we need to trace and mark its cohort.
1202 log_develop_trace(gc, ref)("Precleaning Reference (" INTPTR_FORMAT ": %s)",
1203 p2i(iter.obj()), iter.obj()->klass()->internal_name());
1204 // Remove Reference object from list
1205 iter.remove();
1206 // Keep alive its cohort.
1207 iter.make_referent_alive();
1208 if (UseCompressedOops) {
1209 narrowOop* next_addr = (narrowOop*)java_lang_ref_Reference::next_addr(obj);
1210 keep_alive->do_oop(next_addr);
1211 } else {
1212 oop* next_addr = (oop*)java_lang_ref_Reference::next_addr(obj);
1213 keep_alive->do_oop(next_addr);
1214 }
1215 iter.move_to_next();
1216 } else {
1217 iter.next();
1218 }
1219 }
1220 // Close the reachable set
1221 complete_gc->do_void();
1222
1223 NOT_PRODUCT(
1224 if (iter.processed() > 0) {
1225 log_develop_trace(gc, ref)(" Dropped " SIZE_FORMAT " Refs out of " SIZE_FORMAT " Refs in discovered list " INTPTR_FORMAT,
1226 iter.removed(), iter.processed(), p2i(refs_list.head()));
1227 }
1228 )
1229 }
1230
1231 const char* ReferenceProcessor::list_name(uint i) {
1232 assert(i <= _max_num_q * number_of_subclasses_of_ref(),
1233 "Out of bounds index");
1234
1235 int j = i / _max_num_q;
1236 switch (j) {
1237 case 0: return "SoftRef";
1238 case 1: return "WeakRef";
1239 case 2: return "FinalRef";
1240 case 3: return "PhantomRef";
1241 case 4: return "CleanerRef";
1242 }
1243 ShouldNotReachHere();
1244 return NULL;
1245 }
|