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
 };