您当前的位置: 首页 > 

white camel

暂无认证

  • 1浏览

    0关注

    442博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

第 10 章 一 直接内存 (向系统申请的内存)

white camel 发布时间:2021-01-15 19:37:32 ,浏览量:1

第 10 章 直接内存 1、直接内存概述

直接内存

  1. 不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。
  2. 直接内存是在Java堆外的、直接向系统申请的内存区间。
  3. 来源于NIO,通过存在堆中的DirectByteBuffer操作Native内存
  4. 通常,访问直接内存的速度会优于Java堆。即读写性能高。
  5. 因此出于性能考虑读写频繁的场合可能会考虑使用直接内存。
  6. Java的NIO库允许Java程序使用直接内存,用于数据缓冲区

代码示例

  • 代码
/**
 *  IO                  NIO (New IO / Non-Blocking IO)
 *  byte[] / char[]     Buffer
 *  Stream              Channel
 *
 * 查看直接内存的占用与释放
 */
public class BufferTest {
    private static final int BUFFER = 1024 * 1024 * 1024;//1GB

    public static void main(String[] args){
        //直接分配本地内存空间
        ByteBuffer byteBuffer = ByteBuffer.allocateDirect(BUFFER);
        System.out.println("直接内存分配完毕,请求指示!");

        Scanner scanner = new Scanner(System.in);
        scanner.next();

        System.out.println("直接内存开始释放!");
        byteBuffer = null;
        System.gc();
        scanner.next();
    }
}
  • 直接占用了 1G 的本地内存

image-20200729214811954

  • 释放后,Java程序的内存占用明显减少

image-20200729214909938

2、BIO 与 NIO

非直接缓存区(BIO)

  • 原来采用BIO的架构,在读写本地文件时,我们需要从用户态切换成内核态

image-20200709170907611

直接缓冲区(NIO)

  • NIO 直接操作物理磁盘,省去了中间商赚差价

image-20200729215128430

代码测试

  • 测试代码:分别使用 BIO 和 NIO 复制大文件,看看用时差别
/**
 * @author shkstart  shkstart@126.com
 * @create 2020  0:04
 */
public class BufferTest1 {

    private static final String TO = "F:\\test\\异界BD中字.mp4";
    private static final int _100Mb = 1024 * 1024 * 100;

    public static void main(String[] args) {
        long sum = 0;
        String src = "F:\\test\\异界BD中字.mp4";
        for (int i = 0; i             
关注
打赏
1661428283
查看更多评论
0.0375s