简述
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
相关推荐
mmfinvoker 这是一个简单的 java 库,它使用 nio.MappedByteBuffer 在内存映射文件上实现请求/响应功能。
深入浅出MappedByteBuffer
java8 源码 netty-learn 这是一个用于netty学习的工程 ##NIO基础 三大组件 Channel & Buffer channel有点类似于stream,它就是读写数据的双向通道,可以从channel将数据读入buffer,也可以将buffer中的数据写入到...
实现的简单的数据库(排序想法类似于TeraSort的map阶段),因为单人组队和使用java 时间不长,导致几个关键的想法没有落实(同类index 分散存储 VS 集中存储;按照题意如何减少io次数),最终成绩为33名。但是因为程序...
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....
java的共享内存管理.基于MMF设计。封装了java.nio.MappedByteBuffer.在大流量实时业务系统时,可以极大的提高处理效率
Bug ID 4724038 (fs) Add unmap method to MappedByteBuffer
与已经存在的MappedByteBuffer相比,目标是更好地控制创建,修改和销毁。 它试图统一在不同操作系统上使用此类映射的接口,这意味着许多细节无法实现。 此外,在某些情况下,您可能需要完成目标平台上可能不需要的...
很多时候需要文件做数据交互,接收到文件后需要对文件解析成bean实体类,这里提供的是工具类,任意文件转任意实体都可以,只要简单的配置一下Class类,很实用
版本包含的 JEP(Java/JDK Enhancement Proposals,JDK 增强提案)比 Java 12 和 13 加起来的还要多。总共 16 个新特性如下: 305:Pattern Matching for instanceof (Preview) 为 instanceof 运算符引入模式...
com.mcxiaoke.gradle:packer-ng:1.0. 简短名:packer,可以在项目的 build.gradle 中指定使用,还提供了命令行独立使用的Java和Python脚本。实现原理PackerNg原理优点使用APK注释字段保存渠道信息和MAGIC字节,从...
函数原型 private MappedByteBuffer mappedFile2Buffer(File f) throws Exception 函数说明 把日志文件映射成内存缓冲 参数说明 @param File f日志文件 返回说明 @return MappedByteBuffer 内存映射缓冲。 异常说明 ...
本人初学c++,写了一个小软件,能把大文件分割问小文件,然后可以统国网络传输,到了网络另一端,再用此软件拼接! 希望用过的人能提宝贵意见! 13521825644 qq 362192302
SAMBox使用允许使用基于java.nio.channels.FileChannel , java.io.InputStream和java.nio.MappedByteBuffer的提供的实现之一(是否缓冲)。 通过使用java.lang.StringBuilder池最小化GC。 通过绑定视图的概念直接...
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...
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...
a pratise of bigdata sorting,use some common util or class,like File,FileOutputStream,RandomAccessFile,HashMap,BufferedOutputStream,ByteBuffer,MappedByteBuffer,FileInputStream. as a newer of ...
the performance improvement is not so much as against using MappedByteBuffer. -> Otherwise I will totally use MappedByteBuffer 我无法在symbol.txt上进行验证。 单元测试:我找不到足够的时间来运行所有...
jdk14新特性:改进NullPointerExceptions,通过准确描述哪些变量为null...非易失性映射的字节缓冲将添加新的JDK特定文件映射模式,该模式允许FileChannel API用于创建引用非易失性内存(NVM)的MappedByteBuffer实例。