Fri, 26 Sep 2014 17:48:10 -0400
8047125: (ref) More phantom object references
Reviewed-by: mchung, dfuchs, ahgross, jmasa, brutisso, mgerdin
Contributed-by: kim.barrett@oracle.com
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*) \