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的时候也有足够的私权去释放内存句柄.

  • 相关阅读:
    IdentityServer4 突然登录就不香了?SameSite?
    11111
    搭建ASP.NET Core API框架(1) 从零开始
    搭建ASP.NET WEB API框架(3) 内核数据库
    搭建VUE项目框架(2) 创建项目
    搭建ASP.NET WEB API框架(2) 创建项目
    搭建ASP.NET WEB API框架(1) 从零开始
    搭建ASP.NET MVC5框架(2) 创建项目
    搭建VUE项目框架(1) 从零开始
    搭建ASP.NET MVC5框架(1) 从零开始
  • 原文地址:https://www.cnblogs.com/zolo/p/5849320.html
Copyright © 2011-2022 走看看