1.1.什么是直接内存(Derect Memory)

  在内存模型最开始的章节中,我们画出了JVM的内存模型,里面并不包含直接内存,也就是说这块内存区域并不是JVM运行时数据区的一部分,但它却会被频繁的使用,原因是NIO这个包。

  NIO(New input/output)是JDK1.4中新加入的类,引入了一种基于通道(channel)和缓冲区(buffer)的I/O方式,它可以使用Native函数库直接分配堆外内存,然后通过堆上的DirectByteBuffer对象对这块内存进行引用和操作。

  可以看出,直接内存的大小并不受到java堆大小的限制,甚至不受到JVM进程内存大小的限制。它只受限于本机总内存(RAM及SWAP区或者分页文件)大小以及处理器寻址空间的限制(最常见的就是32位/64位CPU的最大寻址空间限制不同)。

 

1.2.直接内存的OufOfMemoryError

  直接内存出现OutOfMemoryError的原因是对该区域进行内存分配时,其内存与其他内存加起来超过最大物理内存限制(包括物理的和操作系统级的限制),从而导致OutOfMemoryError。另外,若我们通过参数“-XX:MaxDirectMemorySize”指定了直接内存的最大值,其超过指定的最大值时,也会抛出内存溢出异常。

 /**
* jvm直接内存溢出
* JVM参数:-Xmx20M -XX:MaxDirectMemorySize=10M
* Created by chenjunyi on 2018/4/26.
*/
public class DirectMemoryOOM { private static final int _1MB = 1024 * 1024; public static void main(String[] args) throws IllegalAccessException {
//通过反射获取Unsafe类并通过其分配直接内存
Field unsafeField = Unsafe.class.getDeclaredFields()[0];
unsafeField.setAccessible(true);
Unsafe unsafe = (Unsafe) unsafeField.get(null);
while (true) {
unsafe.allocateMemory(_1MB);
}
} }

  结果如下,可以看出,其抛出的内存溢出异常并没有指定是JVM那一块数据区域:

 Exception in thread "main" java.lang.OutOfMemoryError
at sun.misc.Unsafe.allocateMemory(Native Method)
at com.manayi.study.jvm.chapter2._07_DirectMemoryOOM.main(_07_DirectMemoryOOM.java:22)

  上面的例子有点特殊,因为我们使用到了Unsafe这个类(这个类为什么通过反射进行获取先不讨论),它的allocateMemory方法能够直接从堆外内存中申请内存(类比于c的malloc函数)。不同于DirectByteBuffer的内存分配方式(先计算是否有足够的可用内存再决定是手动抛异常还是向操作系统申请分配内存),Unsafe是直接向操作系统申请分配内存,若未申请到则抛异常。

最新文章

  1. DataGridView 在下拉框添加下来事件
  2. servlet(二)
  3. 如何启动app时全屏显示Default.png(图片)?
  4. C#中将结构类型数据存储到二进制文件中方法
  5. [转] jQuery对象与DOM对象之间的转换
  6. Python之str(),repr(),``
  7. mysql select count(filed) 问题(where条件没有数据匹配的话也有数据返回)。
  8. C# 的static与单例模式
  9. Base64原理简介
  10. Java 文件下载
  11. Delphi中使用TXMLDocument控件应注意的问题
  12. jquery 动态生成元素 事件
  13. [HNOI 2004]宠物收养场
  14. Keras的一些功能函数
  15. NTT板子
  16. MATLAB求解二重积分案例
  17. Hbase记录-shell脚本嵌入hbase shell命令
  18. Redis单机安装
  19. 微信小程序之地理位置授权 wx.getLocation
  20. Linux基础-host文件解析

热门文章

  1. EF中連表查詢的應用方式
  2. Loading dl-debug.c in gdb / Ubuntu 14.04.4 LTS
  3. ovs加dpdk在日志中查看更多运行细节的方法
  4. Vue04——vue自定义事件、Router、Vue-cli、发布上线
  5. C#泛型约束 (转载)
  6. Powerdesigner设置表字段注释与name相同
  7. Python 学习笔记(十四)Python类(一)
  8. 通达信k线颜色设置
  9. Mybatis-smart(Mybatis最终优化方案)
  10. #leetcode刷题之路23-合并K个排序链表