66 RefDiscoveryPolicy == ReferentBasedDiscovery, |
66 RefDiscoveryPolicy == ReferentBasedDiscovery, |
67 "Unrecognized RefDiscoveryPolicy"); |
67 "Unrecognized RefDiscoveryPolicy"); |
68 _pending_list_uses_discovered_field = JDK_Version::current().pending_list_uses_discovered_field(); |
68 _pending_list_uses_discovered_field = JDK_Version::current().pending_list_uses_discovered_field(); |
69 } |
69 } |
70 |
70 |
71 void ReferenceProcessor::enable_discovery(bool verify_disabled, bool check_no_refs) { |
71 void ReferenceProcessor::enable_discovery(bool check_no_refs) { |
72 #ifdef ASSERT |
72 #ifdef ASSERT |
73 // Verify that we're not currently discovering refs |
73 // Verify that we're not currently discovering refs |
74 assert(!verify_disabled || !_discovering_refs, "nested call?"); |
74 assert(!_discovering_refs, "nested call?"); |
75 |
75 |
76 if (check_no_refs) { |
76 if (check_no_refs) { |
77 // Verify that the discovered lists are empty |
77 // Verify that the discovered lists are empty |
78 verify_no_references_recorded(); |
78 verify_no_references_recorded(); |
79 } |
79 } |
959 is_alive, keep_alive, complete_gc); |
959 is_alive, keep_alive, complete_gc); |
960 } |
960 } |
961 } |
961 } |
962 |
962 |
963 return total_list_count; |
963 return total_list_count; |
964 } |
|
965 |
|
966 void ReferenceProcessor::clean_up_discovered_references() { |
|
967 // loop over the lists |
|
968 for (uint i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) { |
|
969 if (TraceReferenceGC && PrintGCDetails && ((i % _max_num_q) == 0)) { |
|
970 gclog_or_tty->print_cr( |
|
971 "\nScrubbing %s discovered list of Null referents", |
|
972 list_name(i)); |
|
973 } |
|
974 clean_up_discovered_reflist(_discovered_refs[i]); |
|
975 } |
|
976 } |
|
977 |
|
978 void ReferenceProcessor::clean_up_discovered_reflist(DiscoveredList& refs_list) { |
|
979 assert(!discovery_is_atomic(), "Else why call this method?"); |
|
980 DiscoveredListIterator iter(refs_list, NULL, NULL); |
|
981 while (iter.has_next()) { |
|
982 iter.load_ptrs(DEBUG_ONLY(true /* allow_null_referent */)); |
|
983 oop next = java_lang_ref_Reference::next(iter.obj()); |
|
984 assert(next->is_oop_or_null(), err_msg("Expected an oop or NULL for next field at " PTR_FORMAT, p2i(next))); |
|
985 // If referent has been cleared or Reference is not active, |
|
986 // drop it. |
|
987 if (iter.referent() == NULL || next != NULL) { |
|
988 debug_only( |
|
989 if (PrintGCDetails && TraceReferenceGC) { |
|
990 gclog_or_tty->print_cr("clean_up_discovered_list: Dropping Reference: " |
|
991 INTPTR_FORMAT " with next field: " INTPTR_FORMAT |
|
992 " and referent: " INTPTR_FORMAT, |
|
993 (void *)iter.obj(), (void *)next, (void *)iter.referent()); |
|
994 } |
|
995 ) |
|
996 // Remove Reference object from list |
|
997 iter.remove(); |
|
998 iter.move_to_next(); |
|
999 } else { |
|
1000 iter.next(); |
|
1001 } |
|
1002 } |
|
1003 NOT_PRODUCT( |
|
1004 if (PrintGCDetails && TraceReferenceGC) { |
|
1005 gclog_or_tty->print( |
|
1006 " Removed %d Refs with NULL referents out of %d discovered Refs", |
|
1007 iter.removed(), iter.processed()); |
|
1008 } |
|
1009 ) |
|
1010 } |
964 } |
1011 |
965 |
1012 inline DiscoveredList* ReferenceProcessor::get_discovered_list(ReferenceType rt) { |
966 inline DiscoveredList* ReferenceProcessor::get_discovered_list(ReferenceType rt) { |
1013 uint id = 0; |
967 uint id = 0; |
1014 // Determine the queue index to use for this object. |
968 // Determine the queue index to use for this object. |