Mercurial > hg > openjdk > jdk6 > hotspot
changeset 4077:e5863dac1f12
8047125: (ref) More phantom object references
Reviewed-by: jmasa, kbarrett
Contributed-by: kim.barrett@oracle.com
author | poonam |
---|---|
date | Mon, 19 Jan 2015 03:56:23 +0000 |
parents | df03cb943a14 |
children | 380746a9688b |
files | src/share/vm/classfile/systemDictionary.cpp src/share/vm/classfile/systemDictionary.hpp src/share/vm/classfile/vmSymbols.hpp src/share/vm/memory/referenceProcessor.cpp src/share/vm/memory/referenceProcessor.hpp src/share/vm/runtime/vmStructs.cpp src/share/vm/utilities/globalDefinitions.hpp |
diffstat | 7 files changed, 31 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/src/share/vm/classfile/systemDictionary.cpp Wed Dec 11 01:09:04 2013 +0400 +++ b/src/share/vm/classfile/systemDictionary.cpp Mon Jan 19 03:56:23 2015 +0000 @@ -1991,11 +1991,12 @@ instanceKlass::cast(WK_KLASS(Reference_klass))->set_reference_type(REF_OTHER); instanceRefKlass::update_nonstatic_oop_maps(WK_KLASS(Reference_klass)); - initialize_wk_klasses_through(WK_KLASS_ENUM_NAME(PhantomReference_klass), scan, CHECK); + initialize_wk_klasses_through(WK_KLASS_ENUM_NAME(Cleaner_klass), scan, CHECK); instanceKlass::cast(WK_KLASS(SoftReference_klass))->set_reference_type(REF_SOFT); instanceKlass::cast(WK_KLASS(WeakReference_klass))->set_reference_type(REF_WEAK); instanceKlass::cast(WK_KLASS(FinalReference_klass))->set_reference_type(REF_FINAL); instanceKlass::cast(WK_KLASS(PhantomReference_klass))->set_reference_type(REF_PHANTOM); + instanceKlass::cast(WK_KLASS(Cleaner_klass))->set_reference_type(REF_CLEANER); // JSR 292 classes WKID jsr292_group_start = WK_KLASS_ENUM_NAME(MethodHandle_klass);
--- a/src/share/vm/classfile/systemDictionary.hpp Wed Dec 11 01:09:04 2013 +0400 +++ b/src/share/vm/classfile/systemDictionary.hpp Mon Jan 19 03:56:23 2015 +0000 @@ -123,6 +123,7 @@ template(WeakReference_klass, java_lang_ref_WeakReference, Pre) \ template(FinalReference_klass, java_lang_ref_FinalReference, Pre) \ template(PhantomReference_klass, java_lang_ref_PhantomReference, Pre) \ + template(Cleaner_klass, sun_misc_Cleaner, Pre) \ template(Finalizer_klass, java_lang_ref_Finalizer, Pre) \ \ template(Thread_klass, java_lang_Thread, Pre) \
--- a/src/share/vm/classfile/vmSymbols.hpp Wed Dec 11 01:09:04 2013 +0400 +++ b/src/share/vm/classfile/vmSymbols.hpp Mon Jan 19 03:56:23 2015 +0000 @@ -80,6 +80,7 @@ template(java_lang_ref_WeakReference, "java/lang/ref/WeakReference") \ template(java_lang_ref_FinalReference, "java/lang/ref/FinalReference") \ template(java_lang_ref_PhantomReference, "java/lang/ref/PhantomReference") \ + template(sun_misc_Cleaner, "sun/misc/Cleaner") \ template(java_lang_ref_Finalizer, "java/lang/ref/Finalizer") \ template(java_lang_reflect_AccessibleObject, "java/lang/reflect/AccessibleObject") \ template(java_lang_reflect_Method, "java/lang/reflect/Method") \
--- a/src/share/vm/memory/referenceProcessor.cpp Wed Dec 11 01:09:04 2013 +0400 +++ b/src/share/vm/memory/referenceProcessor.cpp Mon Jan 19 03:56:23 2015 +0000 @@ -116,6 +116,7 @@ _discoveredWeakRefs = &_discoveredSoftRefs[_max_num_q]; _discoveredFinalRefs = &_discoveredWeakRefs[_max_num_q]; _discoveredPhantomRefs = &_discoveredFinalRefs[_max_num_q]; + _discoveredCleanerRefs = &_discoveredPhantomRefs[_max_num_q]; // Initialize all entries to NULL for (uint i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) { @@ -229,6 +230,11 @@ TraceTime tt("PhantomReference", trace_time, false, gclog_or_tty); process_discovered_reflist(_discoveredPhantomRefs, NULL, false, is_alive, keep_alive, complete_gc, task_executor); + // Process cleaners, but include them in phantom statistics. We expect + // Cleaner references to be temporary, and don't want to deal with + // possible incompatibilities arising from making it more visible. + process_discovered_reflist(_discoveredCleanerRefs, NULL, false, + is_alive, keep_alive, complete_gc, task_executor); } // Weak global JNI references. It would make more sense (semantically) to @@ -876,6 +882,7 @@ balance_queues(_discoveredWeakRefs); balance_queues(_discoveredFinalRefs); balance_queues(_discoveredPhantomRefs); + balance_queues(_discoveredCleanerRefs); } void @@ -1034,6 +1041,9 @@ case REF_PHANTOM: list = &_discoveredPhantomRefs[id]; break; + case REF_CLEANER: + list = &_discoveredCleanerRefs[id]; + break; case REF_NONE: // we should not reach here if we are an instanceRefKlass default: @@ -1328,6 +1338,17 @@ preclean_discovered_reflist(_discoveredPhantomRefs[i], is_alive, keep_alive, complete_gc, yield); } + + // Cleaner references. Included in timing for phantom references. We + // expect Cleaner references to be temporary, and don't want to deal with + // possible incompatibilities arising from making it more visible. + for (uint i = 0; i < _max_num_q; i++) { + if (yield->should_return()) { + return; + } + preclean_discovered_reflist(_discoveredCleanerRefs[i], is_alive, + keep_alive, complete_gc, yield); + } } } @@ -1396,6 +1417,7 @@ case 1: return "WeakRef"; case 2: return "FinalRef"; case 3: return "PhantomRef"; + case 4: return "CleanerRef"; } ShouldNotReachHere(); return NULL;
--- a/src/share/vm/memory/referenceProcessor.hpp Wed Dec 11 01:09:04 2013 +0400 +++ b/src/share/vm/memory/referenceProcessor.hpp Mon Jan 19 03:56:23 2015 +0000 @@ -264,9 +264,10 @@ DiscoveredList* _discoveredWeakRefs; DiscoveredList* _discoveredFinalRefs; DiscoveredList* _discoveredPhantomRefs; + DiscoveredList* _discoveredCleanerRefs; public: - static int number_of_subclasses_of_ref() { return (REF_PHANTOM - REF_OTHER); } + static int number_of_subclasses_of_ref() { return (REF_CLEANER - REF_OTHER); } uint num_q() { return _num_q; } uint max_num_q() { return _max_num_q; }
--- a/src/share/vm/runtime/vmStructs.cpp Wed Dec 11 01:09:04 2013 +0400 +++ b/src/share/vm/runtime/vmStructs.cpp Mon Jan 19 03:56:23 2015 +0000 @@ -695,6 +695,7 @@ static_field(SystemDictionary, WK_KLASS(WeakReference_klass), klassOop) \ static_field(SystemDictionary, WK_KLASS(FinalReference_klass), klassOop) \ static_field(SystemDictionary, WK_KLASS(PhantomReference_klass), klassOop) \ + static_field(SystemDictionary, WK_KLASS(Cleaner_klass), klassOop) \ static_field(SystemDictionary, WK_KLASS(Finalizer_klass), klassOop) \ static_field(SystemDictionary, WK_KLASS(Thread_klass), klassOop) \ static_field(SystemDictionary, WK_KLASS(ThreadGroup_klass), klassOop) \
--- a/src/share/vm/utilities/globalDefinitions.hpp Wed Dec 11 01:09:04 2013 +0400 +++ b/src/share/vm/utilities/globalDefinitions.hpp Mon Jan 19 03:56:23 2015 +0000 @@ -709,7 +709,8 @@ REF_SOFT, // Subclass of java/lang/ref/SoftReference REF_WEAK, // Subclass of java/lang/ref/WeakReference REF_FINAL, // Subclass of java/lang/ref/FinalReference - REF_PHANTOM // Subclass of java/lang/ref/PhantomReference + REF_PHANTOM, // Subclass of java/lang/ref/PhantomReference + REF_CLEANER // Subclass of sun/misc/Cleaner };