zoukankan      html  css  js  c++  java
  • Java之nio MappedByteBuffer的资源释放问题

    使用nio的MappedByteBuffer映射内存, 在最后执行File.delete()方法的时候, 返回false,  即文件没有被删除. 原因是MappedByteBuffer在内存中也会创建文件的一个句柄, 所以必须先释放MapppedByteBuffer之后才能执行文件的删除操作.
    如果使用SUN的JDK, 可以使用:
    public static void clean(ByteBuffer bb) {
      if (bb == null)
       return;
      Cleaner cleaner = ((DirectBuffer) bb).cleaner();
      if (cleaner != null)
       cleaner.clean();
    }
    如果使用SUN以外的JDK, 例如JRockit, 必须预防该API不存在, 可以借助反射机制来完成兼容代码:
    public static void clean(final MappedByteBuffer mbb) {
      if (mbb == null) {
       return;
      }

      AccessController.doPrivileged(new PrivilegedAction<Object>() {

       @Override
       public Object run() {

        try {
         Method cleanerMethod = mbb.getClass().getDeclaredMethod("cleaner", new Class[0]);
         if (cleanerMethod != null) {
          cleanerMethod.setAccessible(true);
          Object cleanerObject = cleanerMethod.invoke(mbb, new Object[0]);
          Method cleanMethod = cleanerObject.getClass().getDeclaredMethod("clean", new Class[0]);
          if (cleanMethod != null) {
           cleanMethod.invoke(cleanerObject, new Object[0]);
          }
         }
        } catch (Exception e) {
         logger.error("关闭MappedByteBuffer句柄错误!", e);
        }

        return null;
       }

      });
    }
    使用AccessController目的是为了启动SecurityManager的时候也有足够的私权去释放内存句柄.

  • 相关阅读:
    Elasticsearch 配置优化
    一个Elasticsearch嵌套nested查询的实例
    apache kafka配置中request.required.acks含义
    filebeat配置介绍
    Linux nohup命令详解
    elasticsearch中如何手动控制全文检索结果的精准度
    elasticsearch中filter执行原理深度剖析(bitset机制与caching机制)
    logback与log4j比较
    Markdown常用语法
    Asp.NetCore3.1中JWT认证入门使用(一)
  • 原文地址:https://www.cnblogs.com/zolo/p/5849320.html
Copyright © 2011-2022 走看看