hotspot/src/share/vm/memory/referenceProcessor.cpp
changeset 28212 647b7d0efb88
parent 26831 5c67eb0c46bc
child 28510 4f1d3611e0bc
equal deleted inserted replaced
28211:f3a2bc065255 28212:647b7d0efb88
    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.