第 10 章 直接内存
1、直接内存概述
直接内存
- 不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。
直接内存是在Java堆外的、直接向系统申请的内存区间。
- 来源于NIO,通过存在堆中的DirectByteBuffer操作Native内存
- 通常,访问直接内存的速度会优于Java堆。即读写性能高。
- 因此出于
性能考虑
,读写频繁
的场合可能会考虑使用直接内存。 - 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 的本地内存
- 释放后,Java程序的内存占用明显减少
非直接缓存区(BIO)
- 原来采用BIO的架构,在读写本地文件时,我们需要从用户态切换成内核态
直接缓冲区(NIO)
- NIO 直接操作物理磁盘,省去了中间商赚差价
代码测试
- 测试代码:分别使用 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
关注
打赏
热门博文
- Java从入门到架构师_Elasticsearch
- Java从入门到架构师__JavaSE
- MySQL笔记: B站宋红康最新教程 (持续更新中)
- 学习《Java设计模式》目录索引 (持续更新中)
- 学习《网络协议》目录索引 (持续更新中)
- 学习《Java并发编程》目录索引 (持续更新中)
- 学习《Java虚拟机》目录索引 (持续更新中)
- 学习《恋上数据结构与算法》目录索引 (持续更新中)
- Java学习笔记目录索引 (持续更新中)
- RestTemplate (一) : ClientHttpRequestFactory、ResponseErrorHandler、ResponseExtractor、UriComponents