前言

直接内存大多时候也被称为堆外内存,自从 JDK 引入 NIO 后,直接内存的使用也越来越普遍。通过 native 方法可以分配堆外内存,通过 DirectByteBuffer 对象来操作。

直接内存不属于 Java 堆,所以它不受堆大小限制,但是它受物理内存大小的限制。

配置

可以通过 -XX:MaxDirectMemorySize 参数来设置最大可用直接内存,如果启动时未设置则默认为最大堆内存大小,即与 -Xmx 相同。即假如最大堆内存为1G,则默认直接内存也为1G,那么 JVM 最大需要的内存大小为2G多一些。当直接内存达到最大限制时就会触发GC,如果回收失败则会引起OutOfMemoryError。

分配内存耗时

环境为JDK9,两种内存分配的耗时如下,运行两遍让其预热。可以看到直接内存的分配比较耗时,而堆内存分配操作耗时少好几倍。

public static void directMemoryAllocate() {long tsStart = System.currentTimeMillis();for (int i = 0; i < 100000; i++) {ByteBuffer buffer = ByteBuffer.allocateDirect(400);}System.out.println("direct memory allocate: " + (System.currentTimeMillis() - tsStart) + " ms");tsStart = System.currentTimeMillis();for (int i = 0; i < 100000; i++) {ByteBuffer buffer = ByteBuffer.allocate(400);}System.out.println("heap memory allocate: " + (System.currentTimeMillis() - tsStart) + " ms");}
direct memory allocate: 149 ms
heap memory allocate: 41 ms
direct memory allocate: 122 ms
heap memory allocate: 31 ms

读写操作耗时

环境为JDK9,两种内存的读写操作耗时如下,同样运行两遍让其预热,可以看到直接内存读写操作的速度相对快一些。

public static void memoryRW() {ByteBuffer buffer = ByteBuffer.allocateDirect(400);ByteBuffer buffer2 = ByteBuffer.allocate(400);long tsStart = System.currentTimeMillis();for (int i = 0; i < 100000; i++) {for (int j = 0; j < 100; j++) {buffer.putInt(j);}buffer.flip();for (byte j = 0; j < 100; j++) {buffer.getInt();}buffer.clear();}System.out.println("direct memory rw: " + (System.currentTimeMillis() - tsStart) + " ms");tsStart = System.currentTimeMillis();for (int i = 0; i < 100000; i++) {for (int j = 0; j < 100; j++) {buffer2.putInt(j);}buffer2.flip();for (byte j = 0; j < 100; j++) {buffer2.getInt();}buffer2.clear();}System.out.println("heap memory rw: " + (System.currentTimeMillis() - tsStart) + " ms");}
direct memory rw: 39 ms
heap memory rw: 34 ms
direct memory rw: 23 ms
heap memory rw: 46 ms

总结

理论上直接内存的机制访问速度要快一些,但也不能武断地直接说直接内存快,另外,在内存分配操作上直接内存要慢一些。直接内存更适合在内存申请次数较少,但读写操作较频繁的场景。

————-推荐阅读————

我的2017文章汇总——机器学习篇

我的2017文章汇总——Java及中间件

我的2017文章汇总——深度学习篇

我的2017文章汇总——JDK源码篇

我的2017文章汇总——自然语言处理篇

我的2017文章汇总——Java并发篇


跟我交流,向我提问:

公众号的菜单已分为“读书总结”、“分布式”、“机器学习”、“深度学习”、“NLP”、“Java深度”、“Java并发核心”、“JDK源码”、“Tomcat内核”等,可能有一款适合你的胃口。

为什么写《Tomcat内核设计剖析》

欢迎关注:

直接内存和堆内存谁快相关推荐

  1. java堆内存_java堆内存详解

    http://www.importnew.com/14630.html java堆的特点 <深入理解java虚拟机>是什么描述java堆的 Java堆(Java Heap)是java虚拟机 ...

  2. 栈内存和堆内存的区别

    总结: 1 栈:为编译器自动分配和释放,如函数参数.局部变量.临时变量等等 2 堆:为成员分配和释放,由程序员自己申请.自己释放.否则发生内存泄露.典型为使用new申请的堆内容. 除了这两部分,还有一 ...

  3. 栈内存和堆内存的区别(一个笔试题的一部分)

    笔试题目:请解释一个栈内存与一个堆内存的区别,请分析下面代码运行是否有问题,如果有问题请改正. char* GetMemory(void) { char p[] = "Hello world ...

  4. 栈内存 ,堆内存区别 C++ 动态内存 == 与equal区别 复合函数奇偶性 三角函数转换公式: 虚函数和纯虚函数: C++ 中的运算符重载 数据封装,数据抽象 C++ 接口(抽象类

    目录 栈内存 ,堆内存区别 C++ 动态内存 == 与equal区别 复合函数奇偶性 三角函数转换公式: 虚函数和纯虚函数: C++ 中的运算符重载 数据封装,数据抽象 C++ 接口(抽象类): #和 ...

  5. java中栈和堆都存哪些东西_java中栈内存与堆内存(JVM内存模型)

    java中栈内存与堆内存(JVM内存模型) Java中堆内存和栈内存详解1 和 Java中堆内存和栈内存详解2 都粗略讲解了栈内存和堆内存的区别,以及代码中哪些变量存储在堆中.哪些存储在栈中.内存中的 ...

  6. 秒懂 栈内存和堆内存(深入底层)

    一般理解 很多人对内存的认识并没有那么透彻. 只知道基本数据类型(值类型)存放在"栈内存"中.引用数据类型(对象类型)存放在"堆内存"中. 内存概念 首先,栈和 ...

  7. JavaScript变量——栈内存or堆内存

    原文  http://blog.csdn.net/xdd19910505/article/details/41900693 堆和栈这两个字我们已经接触多很多次,那么具体是什么存在栈中什么存在堆中呢?就 ...

  8. 【Linux 内核 内存管理】Linux 内核堆内存管理 ① ( 堆内存管理 | 内存描述符 mm_struct 结构体 | mm_struct 结构体中的 start_brk、brk 成员 )

    文章目录 一.堆内存管理 二.内存描述符 mm_struct 结构体 三.mm_struct 结构体中的 start_brk.brk 成员 一.堆内存管理 Linux 操作系统中的 " 堆内 ...

  9. python释放变量内存_Python尚学堂高淇|1113引用的本质栈内存,堆内存,内存的示意图,标识符,变量的声明初始化,垃圾回收机制...

    011-引用的本质-栈内存和堆内存-内存的示意图在Python当中,变量也成为:对象的引用,因为,变量的存储就是对象的地址变量通过地址引用了对象变量位于堆内存(压栈,出栈等细节,后续再介绍)对象位于: ...

  10. Docker环境下Java应用的最大内存和堆内存的设置

    Docker环境下Java应用的最大内存和堆内存的设置 1.  设置应用允许使用的最大内存 通过docker run(创建一个新的容器并运行)命令中设置-m来进行设置.案例如下所示. docker r ...

最新文章

  1. Xamarin.Forms教程下载安装JDK配置环境变量
  2. 安卓开发学习日记 DAY5——监听事件onClick的实现方法
  3. 常见的上传绕过以及解析漏洞
  4. ZOJ-3494 BCD Code (ac自动机+数位dp)
  5. Python3.6 IDLE 使用 multiprocessing.Process 不显示执行函数的打印
  6. 终于有人把Docker讲清楚了
  7. JS面向对象的程序设计
  8. android之sqlite操作
  9. Mybatis破MySql8小时断线问题
  10. NSIS中文乱码问题
  11. java计算机毕业设计宠物店管理系统设计与实现MyBatis+系统+LW文档+源码+调试部署
  12. 三阶魔方6步过程总结
  13. 6步解决win7局域网内传输慢的问题
  14. flex:1 代表了什么意思
  15. hzhost防asp攻击函数
  16. 2005年商业科技盘点:最被高估10大技术
  17. 什么是预测区间和置信区间
  18. 数据挖掘与R分析——京东某鞋类店铺售后评论
  19. CSS字体样式属性(font-size、font-family、Unicode、font-weight、font-style、font)
  20. 人工智能教程 - 前言

热门文章

  1. 利用 DTMaster 立体编辑 DEM 方法
  2. Pytorch和Tensorflow在10000*1000数据规模线性回归算法中的运算速度对比
  3. 商贸公司用什么软件可以提升企业管理效率呢?
  4. Win10打开系统服务管理器
  5. 2018虹软视觉AI开放平台开发者大赛,助力开发者梦想起航
  6. 破解红外发射-美的空调实战篇
  7. 解读2019年锂矿供应预判
  8. Eudemon 200   Eudemon 200
  9. 谷歌(google)世界各国网址大全世界各国google网址
  10. 成长型思维与固定型思维的PK