直接内存(Direct Memory)牛刀小试

简介: 直接内存(Direct Memory)牛刀小试

Direct Memory

特点

  • 常见于NIO操作时,用于数据缓存
  • 分配回收成本较高,但是读写性能高
  • 不受JVM内存回收管理

案例说明

为了做对比,还是直接写一段程序测试:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

/**
 * 直接内存的读写测试
 */
public class Jvm1_9 {
    static final String fromFile="/tmp/12GB.dat";
    static final String toFile="/tmp/12GB_new.dat";
    //mkfile -n 12g  /tmp/12GB.dat
    static  final int _256M =256*1024*1024;
    public static void main(String[] args) {
        io();
        directBuffer();
    }
    public static  void ready(String file){
        File   f=new File(file);
        if(f.exists()){
            f.delete();
        }
    }
    public static void io(){
        ready(toFile);
        long start=System.nanoTime();
        try(FileInputStream from =new FileInputStream(fromFile);
            FileOutputStream to=new FileOutputStream((toFile));
        ){
           byte[] buffer=new  byte[_256M];
           while (true){
               int len=from.read(buffer);
              if(len==-1){
                  break;
              }
              to.write(buffer);
           }
        }catch (IOException e){
            e.printStackTrace();
        }
        long end=System.nanoTime();
        System.out.println("io耗时:"+(end-start)/1000_000.0);
    }
    public static void directBuffer(){
        ready(toFile);
        long start=System.nanoTime();
        try(FileChannel from =new FileInputStream(fromFile).getChannel();
            FileChannel to=new FileOutputStream((toFile)).getChannel();
            ){
            ByteBuffer byteBuffer=ByteBuffer.allocateDirect(_256M);
            while (true){
                int len=from.read(byteBuffer);
                if(len==-1){
                    break;
                }
                byteBuffer.flip();
                to.write(byteBuffer);
                byteBuffer.clear();
            }
        }catch (IOException e){
            e.printStackTrace();
        }
        long end=System.nanoTime();
        System.out.println("directBuffer耗时:"+(end-start)/1000_000.0);
    }
}

程序说明:

分别使用传统的IO操作和使用direct操作进行对比,分配一样大小的buffer进行操作,然后做耗时对比。运行之前需要创建一个比较大的文件:

mkfile -n 12g  /tmp/12GB.dat

运行结果如下:

io耗时:38111.937769
directBuffer耗时:21497.436392

我们可以看到directbuffer有明显的提升,不过需要说明的是这个操作需要不断测试,而且文件的大小需要上量级,一开始我用来几M文件做测试,效果其实差别不大,主要是两种操作都比较快,不能说明问题。当文件数量达到一定规模之后,这种差异逐渐会稳定下来

目录
相关文章
|
2月前
|
Python
什么是Python中的内存池(Memory Pool)?
什么是Python中的内存池(Memory Pool)?
55 0
|
2月前
|
数据库 数据库管理 Python
解释Python中的内存视图(Memory View)。
解释Python中的内存视图(Memory View)。
|
19天前
|
存储 缓存 安全
深入理解 Java 内存模型(Java Memory Model, JMM)
深入理解 Java 内存模型(Java Memory Model, JMM)
15 0
|
2月前
|
缓存 Java 开发工具
OOM out of memory 内存溢出
OOM out of memory 内存溢出
32 1
|
2月前
|
SQL Oracle 关系型数据库
实时计算 Flink版产品使用合集之Managed Memory内存的含义是什么
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
2月前
|
JavaScript 前端开发
FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 内存溢出问题
FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 内存溢出问题
39 1
|
2月前
|
缓存 NoSQL 中间件
redis内存溢出报错--OOM command not allowed when used memory > 'maxmemory'
该内容是关于Redis缓存服务器的使用指南。通过Xshell连接IP地址为25.218.153.193或206的主机,进入/data/iuap/middleware/redis-30001/bin目录,使用`redis-cli`连接到IP为206的30003端口。登录时需`auth yonyou*123`,可运行`info`和`info memory`查看状态,`flushall`清理缓存。在清理前,要备份/data/iuap/middleware/redis-30003/data/下的.aof和.rdb文件,利用tar命令打包并移至/tmp目录。
|
2月前
|
存储 缓存 Java
Java内存模型(Java Memory Model,JMM)
Java内存模型(Java Memory Model,JMM)
35 1
|
2月前
|
存储 Java C#
C# | 使用Memory<T>高效地读写内存数据
Memory<T>是什么? 它是一种可变大小、可读写的内存块,可以安全地暴露给用户代码进行操作。 为什么要使用Memory<T>? 使用它有许多好处。最主要的是善用它可以提高代码的性能。因为Memory<T>是可变的,所以我们可以直接在内存中操作数据,而不需要进行额外的拷贝操作。 使用Memory<T>还可以减少垃圾回收的压力,因为我们不需要创建新的对象来存储数据。 Memory<T>还可以与Span<T>和ReadOnlySpan<T>类型一起使用,这些类型可以方便地对数据进行访问和操作。
63 0
|
9月前
|
SQL 人工智能 移动开发
Memory Analyzer(MAT)分析内存
MAT是Memory Analyzer tool的缩写,是一款非常强大的内存分析工具,只需要打开采集的hprof文件即可开始对内存开始分析对比,一款“傻瓜式“的堆转储文件分析工具,谁都能学会。