`

【Java核心-基础】DirectBuffer 和 MappedByteBuffer

    博客分类:
  • Java
 
阅读更多

简述

Java NIO 中提供了 DirectBuffer、MappedByteBuffer 以提高IO效率。



 

DirectBuffer

DirectBuffer 占用的是 堆外内存。JVM 会在 DirectBuffer 上直接使用 “本地IO操作”(Native I/O Operations)。
Buffer 的地址对“本地IO操作”非常关键。所以在操作 堆内Buffer 时,JVM需要将其数据先复制到一个堆外Buffer,让“本地IO操作”读写此堆外Buffer。
这样可以防止GC活动改变堆内Buffer地址的影响(寻址更简单)。
所以使用DirectBuffer可以避免额外的数据复制,提高IO效率。同时也可以降低GC的工作量

当需要 容量较大长期使用 的缓存时可考虑使用 DirectBuffer。当然也需要测试确定是否能获得性能提升。
 

ByteBuffer buffer =  ByteBuffer.allocateDirect(1024);
public abstract class ByteBuffer {
  public static ByteBuffer allocateDirect(int capacity) {
    return new DirectByteBuffer(capacity);
  }

  public static ByteBuffer allocate(int capacity) {
    if (capacity<0)
      throw createCapacityException(capacity);
    return new HeapByteBuffer(capacity, capacity);
  }
  ...
}

 

MappedByteBuffer

MappedByteBuffer 可以 将文件内容映射到内存,供应用程序直接使用,省去数据在 内核空间 和 用户空间 之间传输的损耗。
它本质上也是一种 DirectBuffer。JDK 中用的是它的子类 DirectByteBuffer,这个类就实现了 DirectBuffer 接口。

MappedByteBuffer buffer = fileChannel.map(MapMode.READ_ONLY, 0, 1024);

 

内存管理

设置最大允许内存

对于这些占用堆外内存的对象,可以通过启动参数来设置最大占用空间。

-XX:MaxDirectMemory=512M

 

内存回收

DirectBuffer 一般是在 Full GC 时被回收。 可以显式调用 System.gc() 强制触发GC。
也可以像Netty那样 hack 到内部 主动调用释放方法;禁用显式调用 gc(-XX:+DisableExplicitGC)


DirectByteBuffer 的内部类 Deallocator 实现了具体的回收方法。由 Cleaner 调用该方法。

private static class Deallocator implements Runnable{
  ...
  public void run() {
    if (address == 0) {
      return;
    }
    UNSAFE.freeMemory(address);
    address = 0;
    Bits.unreserveMemory(size, capacity);
  }
}

 

诊断 和 跟踪 内存占用

可通过 JConsole 等一些图形化工具查看这些堆外内存。
也可以通过 jcmd 命令行查看:

  • 通过启动参数开启 Native Memory Tracking (NMT) 特性。(这会导致可观的性能下降)
  • 通过 jcmd 查看相关信息。

    如: jcmd <pid> VM.native_memory detail
    jcmd <pid> VM.native_memory baseline
    jcmd <pid> VM.native_memory detail.diff

 

  • 大小: 9.1 KB
分享到:
评论

相关推荐

    mmfinvoker:简单的进程间 java 请求-响应库

    mmfinvoker 这是一个简单的 java 库,它使用 nio.MappedByteBuffer 在内存映射文件上实现请求/响应功能。

    深入浅出MappedByteBuffer.pdf

    深入浅出MappedByteBuffer

    java8源码-netty-learn:这是一个用于netty学习的工程

    java8 源码 netty-learn 这是一个用于netty学习的工程 ##NIO基础 三大组件 Channel & Buffer channel有点类似于stream,它就是读写数据的双向通道,可以从channel将数据读入buffer,也可以将buffer中的数据写入到...

    百度地图开发java源码-inertiaSearch:挑战赛

    实现的简单的数据库(排序想法类似于TeraSort的map阶段),因为单人组队和使用java 时间不长,导致几个关键的想法没有落实(同类index 分散存储 VS 集中存储;按照题意如何减少io次数),最终成绩为33名。但是因为程序...

    javaredis源码-jredis-master:java实现redis

    java redis源码杰里迪斯 Java的redis实现,与redis服务器相同。 特征 支持的命令列表 1.set get 2.lpush rpush lrange blpop brpop llen 3.hset hget hgetall hscan 4.pub sub 5.select keys scan expire del 6....

    commons-mmf.rar_java nio_java共享内存_共享内存

    java的共享内存管理.基于MMF设计。封装了java.nio.MappedByteBuffer.在大流量实时业务系统时,可以极大的提高处理效率

    Bug ID 4724038 (fs) Add unmap method to MappedByteBuffer

    Bug ID 4724038 (fs) Add unmap method to MappedByteBuffer

    mmf4j:MemoryMappedFiles4Java

    与已经存在的MappedByteBuffer相比,目标是更好地控制创建,修改和销毁。 它试图统一在不同操作系统上使用此类映射的接口,这意味着许多细节无法实现。 此外,在某些情况下,您可能需要完成目标平台上可能不需要的...

    读取文件数据并解析成bean实体类

    很多时候需要文件做数据交互,接收到文件后需要对文件解析成bean实体类,这里提供的是工具类,任意文件转任意实体都可以,只要简单的配置一下Class类,很实用

    jdk-14_linux-x64_bin.rpm

    版本包含的 JEP(Java/JDK Enhancement Proposals,JDK 增强提案)比 Java 12 和 13 加起来的还要多。总共 16 个新特性如下: 305:Pattern Matching for instanceof (Preview) 为 instanceof 运算符引入模式...

    Android渠道打包工具packer-ng-plugin.zip

    com.mcxiaoke.gradle:packer-ng:1.0. 简短名:packer,可以在项目的 build.gradle 中指定使用,还提供了命令行独立使用的Java和Python脚本。实现原理PackerNg原理优点使用APK注释字段保存渠道信息和MAGIC字节,从...

    j2se项目源码及介绍_last指令

    函数原型 private MappedByteBuffer mappedFile2Buffer(File f) throws Exception 函数说明 把日志文件映射成内存缓冲 参数说明 @param File f日志文件 返回说明 @return MappedByteBuffer 内存映射缓冲。 异常说明 ...

    文件分割和合并(您的文件大的不能传输怎么办?)

    本人初学c++,写了一个小软件,能把大文件分割问小文件,然后可以统国网络传输,到了网络另一端,再用此软件拼接! 希望用过的人能提宝贵意见! 13521825644 qq 362192302

    sambox:一个PDFBox分支,打算用作Sejda和PDFsam的PDF处理程序

    SAMBox使用允许使用基于java.nio.channels.FileChannel , java.io.InputStream和java.nio.MappedByteBuffer的提供的实现之一(是否缓冲)。 通过使用java.lang.StringBuilder池最小化GC。 通过绑定视图的概念直接...

    ip地址库 很全的库

    import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; import java.util.ArrayList; import java.util.Hashtable; import java.util.List; import java.util.regex.Matcher; import java...

    txt文档阅读器

    import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; import java.text.DecimalFormat; import java.util.Vector; import android.graphics.Bitmap; import android.graphics.Canvas; import...

    Android代码-BitMap

    a pratise of bigdata sorting,use some common util or class,like File,FileOutputStream,RandomAccessFile,HashMap,BufferedOutputStream,ByteBuffer,MappedByteBuffer,FileInputStream. as a newer of ...

    CsvReader:CsvReader

    the performance improvement is not so much as against using MappedByteBuffer. -&gt; Otherwise I will totally use MappedByteBuffer 我无法在symbol.txt上进行验证。 单元测试:我找不到足够的时间来运行所有...

    【密码:5261】Oracle官网下载64位-JDK14

    jdk14新特性:改进NullPointerExceptions,通过准确描述哪些变量为null...非易失性映射的字节缓冲将添加新的JDK特定文件映射模式,该模式允许FileChannel API用于创建引用非易失性内存(NVM)的MappedByteBuffer实例。

Global site tag (gtag.js) - Google Analytics