8047125: (ref) More phantom object references

Fri, 26 Sep 2014 17:48:10 -0400

author
jmasa
date
Fri, 26 Sep 2014 17:48:10 -0400
changeset 7701
0366a71eda74
parent 7700
cf78930a882a
child 7702
22ac20a25842

8047125: (ref) More phantom object references
Reviewed-by: mchung, dfuchs, ahgross, jmasa, brutisso, mgerdin
Contributed-by: kim.barrett@oracle.com

src/share/vm/classfile/systemDictionary.cpp file | annotate | diff | comparison | revisions
src/share/vm/classfile/systemDictionary.hpp file | annotate | diff | comparison | revisions
src/share/vm/classfile/vmSymbols.hpp file | annotate | diff | comparison | revisions
src/share/vm/memory/referenceProcessor.cpp file | annotate | diff | comparison | revisions
src/share/vm/memory/referenceProcessor.hpp file | annotate | diff | comparison | revisions
src/share/vm/memory/referenceType.hpp file | annotate | diff | comparison | revisions
src/share/vm/runtime/vmStructs.cpp file | annotate | diff | comparison | revisions
     1.1 --- a/src/share/vm/classfile/systemDictionary.cpp	Thu Oct 09 13:22:41 2014 -0700
     1.2 +++ b/src/share/vm/classfile/systemDictionary.cpp	Fri Sep 26 17:48:10 2014 -0400
     1.3 @@ -1866,11 +1866,12 @@
     1.4    InstanceKlass::cast(WK_KLASS(Reference_klass))->set_reference_type(REF_OTHER);
     1.5    InstanceRefKlass::update_nonstatic_oop_maps(WK_KLASS(Reference_klass));
     1.6  
     1.7 -  initialize_wk_klasses_through(WK_KLASS_ENUM_NAME(PhantomReference_klass), scan, CHECK);
     1.8 +  initialize_wk_klasses_through(WK_KLASS_ENUM_NAME(Cleaner_klass), scan, CHECK);
     1.9    InstanceKlass::cast(WK_KLASS(SoftReference_klass))->set_reference_type(REF_SOFT);
    1.10    InstanceKlass::cast(WK_KLASS(WeakReference_klass))->set_reference_type(REF_WEAK);
    1.11    InstanceKlass::cast(WK_KLASS(FinalReference_klass))->set_reference_type(REF_FINAL);
    1.12    InstanceKlass::cast(WK_KLASS(PhantomReference_klass))->set_reference_type(REF_PHANTOM);
    1.13 +  InstanceKlass::cast(WK_KLASS(Cleaner_klass))->set_reference_type(REF_CLEANER);
    1.14  
    1.15    // JSR 292 classes
    1.16    WKID jsr292_group_start = WK_KLASS_ENUM_NAME(MethodHandle_klass);
     2.1 --- a/src/share/vm/classfile/systemDictionary.hpp	Thu Oct 09 13:22:41 2014 -0700
     2.2 +++ b/src/share/vm/classfile/systemDictionary.hpp	Fri Sep 26 17:48:10 2014 -0400
     2.3 @@ -127,6 +127,7 @@
     2.4    do_klass(WeakReference_klass,                         java_lang_ref_WeakReference,               Pre                 ) \
     2.5    do_klass(FinalReference_klass,                        java_lang_ref_FinalReference,              Pre                 ) \
     2.6    do_klass(PhantomReference_klass,                      java_lang_ref_PhantomReference,            Pre                 ) \
     2.7 +  do_klass(Cleaner_klass,                               sun_misc_Cleaner,                          Pre                 ) \
     2.8    do_klass(Finalizer_klass,                             java_lang_ref_Finalizer,                   Pre                 ) \
     2.9                                                                                                                           \
    2.10    do_klass(Thread_klass,                                java_lang_Thread,                          Pre                 ) \
     3.1 --- a/src/share/vm/classfile/vmSymbols.hpp	Thu Oct 09 13:22:41 2014 -0700
     3.2 +++ b/src/share/vm/classfile/vmSymbols.hpp	Fri Sep 26 17:48:10 2014 -0400
     3.3 @@ -79,6 +79,7 @@
     3.4    template(java_lang_ref_WeakReference,               "java/lang/ref/WeakReference")              \
     3.5    template(java_lang_ref_FinalReference,              "java/lang/ref/FinalReference")             \
     3.6    template(java_lang_ref_PhantomReference,            "java/lang/ref/PhantomReference")           \
     3.7 +  template(sun_misc_Cleaner,                          "sun/misc/Cleaner")                         \
     3.8    template(java_lang_ref_Finalizer,                   "java/lang/ref/Finalizer")                  \
     3.9    template(java_lang_reflect_AccessibleObject,        "java/lang/reflect/AccessibleObject")       \
    3.10    template(java_lang_reflect_Method,                  "java/lang/reflect/Method")                 \
     4.1 --- a/src/share/vm/memory/referenceProcessor.cpp	Thu Oct 09 13:22:41 2014 -0700
     4.2 +++ b/src/share/vm/memory/referenceProcessor.cpp	Fri Sep 26 17:48:10 2014 -0400
     4.3 @@ -118,6 +118,7 @@
     4.4    _discoveredWeakRefs    = &_discoveredSoftRefs[_max_num_q];
     4.5    _discoveredFinalRefs   = &_discoveredWeakRefs[_max_num_q];
     4.6    _discoveredPhantomRefs = &_discoveredFinalRefs[_max_num_q];
     4.7 +  _discoveredCleanerRefs = &_discoveredPhantomRefs[_max_num_q];
     4.8  
     4.9    // Initialize all entries to NULL
    4.10    for (uint i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) {
    4.11 @@ -245,6 +246,13 @@
    4.12      phantom_count =
    4.13        process_discovered_reflist(_discoveredPhantomRefs, NULL, false,
    4.14                                   is_alive, keep_alive, complete_gc, task_executor);
    4.15 +
    4.16 +    // Process cleaners, but include them in phantom statistics.  We expect
    4.17 +    // Cleaner references to be temporary, and don't want to deal with
    4.18 +    // possible incompatibilities arising from making it more visible.
    4.19 +    phantom_count +=
    4.20 +      process_discovered_reflist(_discoveredCleanerRefs, NULL, false,
    4.21 +                                 is_alive, keep_alive, complete_gc, task_executor);
    4.22    }
    4.23  
    4.24    // Weak global JNI references. It would make more sense (semantically) to
    4.25 @@ -882,6 +890,7 @@
    4.26    balance_queues(_discoveredWeakRefs);
    4.27    balance_queues(_discoveredFinalRefs);
    4.28    balance_queues(_discoveredPhantomRefs);
    4.29 +  balance_queues(_discoveredCleanerRefs);
    4.30  }
    4.31  
    4.32  size_t
    4.33 @@ -1041,6 +1050,9 @@
    4.34      case REF_PHANTOM:
    4.35        list = &_discoveredPhantomRefs[id];
    4.36        break;
    4.37 +    case REF_CLEANER:
    4.38 +      list = &_discoveredCleanerRefs[id];
    4.39 +      break;
    4.40      case REF_NONE:
    4.41        // we should not reach here if we are an InstanceRefKlass
    4.42      default:
    4.43 @@ -1305,6 +1317,17 @@
    4.44        preclean_discovered_reflist(_discoveredPhantomRefs[i], is_alive,
    4.45                                    keep_alive, complete_gc, yield);
    4.46      }
    4.47 +
    4.48 +    // Cleaner references.  Included in timing for phantom references.  We
    4.49 +    // expect Cleaner references to be temporary, and don't want to deal with
    4.50 +    // possible incompatibilities arising from making it more visible.
    4.51 +    for (uint i = 0; i < _max_num_q; i++) {
    4.52 +      if (yield->should_return()) {
    4.53 +        return;
    4.54 +      }
    4.55 +      preclean_discovered_reflist(_discoveredCleanerRefs[i], is_alive,
    4.56 +                                  keep_alive, complete_gc, yield);
    4.57 +    }
    4.58    }
    4.59  }
    4.60  
    4.61 @@ -1373,6 +1396,7 @@
    4.62       case 1: return "WeakRef";
    4.63       case 2: return "FinalRef";
    4.64       case 3: return "PhantomRef";
    4.65 +     case 4: return "CleanerRef";
    4.66     }
    4.67     ShouldNotReachHere();
    4.68     return NULL;
     5.1 --- a/src/share/vm/memory/referenceProcessor.hpp	Thu Oct 09 13:22:41 2014 -0700
     5.2 +++ b/src/share/vm/memory/referenceProcessor.hpp	Fri Sep 26 17:48:10 2014 -0400
     5.3 @@ -263,9 +263,10 @@
     5.4    DiscoveredList* _discoveredWeakRefs;
     5.5    DiscoveredList* _discoveredFinalRefs;
     5.6    DiscoveredList* _discoveredPhantomRefs;
     5.7 +  DiscoveredList* _discoveredCleanerRefs;
     5.8  
     5.9   public:
    5.10 -  static int number_of_subclasses_of_ref() { return (REF_PHANTOM - REF_OTHER); }
    5.11 +  static int number_of_subclasses_of_ref() { return (REF_CLEANER - REF_OTHER); }
    5.12  
    5.13    uint num_q()                             { return _num_q; }
    5.14    uint max_num_q()                         { return _max_num_q; }
     6.1 --- a/src/share/vm/memory/referenceType.hpp	Thu Oct 09 13:22:41 2014 -0700
     6.2 +++ b/src/share/vm/memory/referenceType.hpp	Fri Sep 26 17:48:10 2014 -0400
     6.3 @@ -35,7 +35,8 @@
     6.4    REF_SOFT,      // Subclass of java/lang/ref/SoftReference
     6.5    REF_WEAK,      // Subclass of java/lang/ref/WeakReference
     6.6    REF_FINAL,     // Subclass of java/lang/ref/FinalReference
     6.7 -  REF_PHANTOM    // Subclass of java/lang/ref/PhantomReference
     6.8 +  REF_PHANTOM,   // Subclass of java/lang/ref/PhantomReference
     6.9 +  REF_CLEANER    // Subclass of sun/misc/Cleaner
    6.10  };
    6.11  
    6.12  #endif // SHARE_VM_MEMORY_REFRERENCETYPE_HPP
     7.1 --- a/src/share/vm/runtime/vmStructs.cpp	Thu Oct 09 13:22:41 2014 -0700
     7.2 +++ b/src/share/vm/runtime/vmStructs.cpp	Fri Sep 26 17:48:10 2014 -0400
     7.3 @@ -670,6 +670,7 @@
     7.4        static_field(SystemDictionary,            WK_KLASS(WeakReference_klass),                 Klass*)                               \
     7.5        static_field(SystemDictionary,            WK_KLASS(FinalReference_klass),                Klass*)                               \
     7.6        static_field(SystemDictionary,            WK_KLASS(PhantomReference_klass),              Klass*)                               \
     7.7 +      static_field(SystemDictionary,            WK_KLASS(Cleaner_klass),                       Klass*)                               \
     7.8        static_field(SystemDictionary,            WK_KLASS(Finalizer_klass),                     Klass*)                               \
     7.9        static_field(SystemDictionary,            WK_KLASS(Thread_klass),                        Klass*)                               \
    7.10        static_field(SystemDictionary,            WK_KLASS(ThreadGroup_klass),                   Klass*)                               \

mercurial