You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mnemonic.apache.org by ga...@apache.org on 2017/12/31 05:04:04 UTC

mnemonic git commit: MNEMONIC-435: Not found class Cleaner

Repository: mnemonic
Updated Branches:
  refs/heads/master 5dd702e28 -> f61b056b6


MNEMONIC-435: Not found class Cleaner


Project: http://git-wip-us.apache.org/repos/asf/mnemonic/repo
Commit: http://git-wip-us.apache.org/repos/asf/mnemonic/commit/f61b056b
Tree: http://git-wip-us.apache.org/repos/asf/mnemonic/tree/f61b056b
Diff: http://git-wip-us.apache.org/repos/asf/mnemonic/diff/f61b056b

Branch: refs/heads/master
Commit: f61b056b64b7102bf0c1cc56639f2537962e6bb9
Parents: 5dd702e
Author: Ganhuazhang <ga...@gmail.com>
Authored: Sat Dec 30 20:36:31 2017 -0800
Committer: Ganhuazhang <ga...@gmail.com>
Committed: Sat Dec 30 20:36:31 2017 -0800

----------------------------------------------------------------------
 .../org/apache/mnemonic/SysMemAllocator.java    | 38 +++++++++++++++-----
 1 file changed, 29 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mnemonic/blob/f61b056b/mnemonic-core/src/main/java/org/apache/mnemonic/SysMemAllocator.java
----------------------------------------------------------------------
diff --git a/mnemonic-core/src/main/java/org/apache/mnemonic/SysMemAllocator.java b/mnemonic-core/src/main/java/org/apache/mnemonic/SysMemAllocator.java
index 5716ce4..5110b8d 100644
--- a/mnemonic-core/src/main/java/org/apache/mnemonic/SysMemAllocator.java
+++ b/mnemonic-core/src/main/java/org/apache/mnemonic/SysMemAllocator.java
@@ -22,10 +22,10 @@ import org.flowcomputing.commons.resgc.ResCollector;
 import org.flowcomputing.commons.resgc.ResReclaim;
 import org.flowcomputing.commons.resgc.ReclaimContext;
 
-import sun.misc.Cleaner;
 import sun.misc.Unsafe;
 
-import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.lang.reflect.InvocationTargetException;
 import java.nio.ByteBuffer;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
@@ -48,6 +48,27 @@ public class SysMemAllocator extends CommonAllocator<SysMemAllocator> {
   private long maxStoreCapacity = 0L;
   private Map<Long, Long> m_chunksize = new ConcurrentHashMap<Long, Long>();
 
+  static final Method CLEANMETHOD;
+
+  static {
+    try {
+      Class<?> cleanerOrCleanable;
+      try {
+        cleanerOrCleanable = Class.forName("sun.misc.Cleaner");
+      } catch (ClassNotFoundException e1) {
+        try {
+          cleanerOrCleanable = Class.forName("java.lang.ref.Cleaner$Cleanable");
+        } catch (ClassNotFoundException e2) {
+          e2.addSuppressed(e1);
+          throw e2;
+        }
+      }
+      CLEANMETHOD = cleanerOrCleanable.getDeclaredMethod("clean");
+    } catch (Exception e) {
+      throw new Error(e);
+    }
+  }
+
   /**
    * Constructor, it initialize and allocate a memory pool from Java off-heap
    * with specified capacity.
@@ -80,13 +101,12 @@ public class SysMemAllocator extends CommonAllocator<SysMemAllocator> {
         }
         if (!cb_reclaimed) {
           try {
-            Field cleanerField;
-            cleanerField = mres.getClass().getDeclaredField("cleaner");
-            cleanerField.setAccessible(true);
-            Cleaner cleaner = (Cleaner) cleanerField.get(mres);
-            cleaner.clean();
-          } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) {
-            e.printStackTrace();
+            final Object bufferCleaner = ((sun.nio.ch.DirectBuffer) mres).cleaner();
+            if (null != bufferCleaner) {
+              CLEANMETHOD.invoke(bufferCleaner);
+            }
+          } catch (InvocationTargetException | IllegalAccessException e) {
+            throw new Error(e);
           }
           mres = null;
         }