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