直接内存

直接内存(Direct Memory)并不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。但是这部分内存也被频繁地使用,而且也可能导致OutOfMemoryError异常出现。

在JDK 1.4中新加入了NIO(New Input/Output)类,引入了一种基于通道(Channel)与缓冲区(Buffer)的I/O方式,它可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆里面的DirectByteBuffer对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因为避免了在Java堆和Native堆中来回复制数据。

显然,本机直接内存的分配不会受到Java堆大小的限制,但是,既然是内存,则肯定还是会受到本机总内存(包括物理内存、SWAP分区或者分页文件)大小以及处理器寻址空间的限制,一般服务器管理员配置虚拟机参数时,会根据实际内存去设置-Xmx等参数信息,但经常忽略掉直接内存,使得各个内存区域总和大于物理内存限制(包括物理的和操作系统级的限制),从而导致动态扩展时出现OutOfMemoryError异常。

解释一下系统级的限制:32位操作系统最大可用内存为4G。

直接内存调参

直接内存(Direct Memory)的容量大小可通过-XX:MaxDirectMemorySize参数来指定,如果不去指定,则默认与Java堆最大值(由-Xmx指定)一致

DirectByteBuffer类

DirectByteBuffer类直接通过反射获取Unsafe实例进行内存分配(Unsafe类的getUnsafe()方法指定只有引导类加载器才会返回实例,体现了设计者希望只有虚拟机标准类库里面的类才能使用Unsafe的功能,在JDK 10时才将Unsafe的部分功能通过VarHandle开放给外部使用),因为虽然使用DirectByteBuffer分配内存也会抛出内存溢出异常,但它抛出异常时并没有真正向操作系统申请分配内存,而是通过计算得知内存无法分配就会在代码里手动抛出溢出异常,真正申请分配内存的方法是Unsafe::allocateMemory()。

获取Unsafe实例的方法(反射)

直接内存OOM 不会在Dump文件中做记录

由直接内存导致的内存溢出,一个明显的特征是在Heap Dump文件中不会看见有什么明显的异常情况,如果读者发现内存溢出之后产生的Dump文件很小,而程序中又直接或间接使用了DirectMemory(典型的间接使用就是NIO),那就可以考虑重点检查一下直接内存方面的原因了。

JAVA的直接内存介绍相关推荐

  1. 介绍Java中的内存泄漏

    转载自  介绍Java中的内存泄漏 Java语言的一个关键的优势就是它的内存管理机制.你只管创建对象,Java的垃圾回收器帮你分配以及回收内存.然而,实际的情况并没有那么简单,因为内存泄漏在Java应 ...

  2. java关键字 valotile_Java内存模型-jsr133规范介绍,java中volatile关键字的含义

    最近在看<深入理解Java虚拟机:JVM高级特性与最佳实践>讲到了线程相关的细节知识,里面讲述了关于java内存模型,也就是jsr 133定义的规范. 系统的看了jsr 133规范的前面几 ...

  3. java 看虚拟机内存_java 虚拟机内存介绍

    已经入行快有两年了,然而没有认真看过java虚拟机内存的介绍,下面把自己看的关于java虚拟机内存的介绍写下来,分享给大家. java 虚拟机在运行时将内存分为几个区域,分别为程序记数区,java虚拟 ...

  4. 深入理解Java中的内存泄漏

    理解Java中的内存泄漏,我们首先要清楚Java中的内存区域分配问题和内存回收的问题本文将分为三大部分介绍这些内容. Java中的内存分配 Java中的内存区域主要分为线程共享的和线程私有的两大区域: ...

  5. JAVA垃圾回收器的介绍

    JAVA垃圾回收器的介绍 垃圾回收器一共有7种: 如下图 其中G1 和 CMS 属于比较新的,暂停时间比之前较少. serial serial Old parNew 这个是serial的多线程版本. ...

  6. Java虚拟机的内存空间有几种!

    Java虚拟机的内存空间有几种? (1)问题分析: JVM(虚拟机)的内存划分 不同的数据使用的是哪一块内存空间 (2)核心答案讲解: Java虚拟机有那几块内存空间: 1)栈内存:方法运行时所进入的 ...

  7. 写java线程导致电脑内存不足_如何写出让java虚拟机发生内存溢出异常OutOfMemoryError的代码...

    程序小白在写代码的过程中,经常会不经意间写出发生内存溢出异常的代码.很多时候这类异常如何产生的都傻傻弄不清楚,如果能故意写出让jvm发生内存溢出的代码,有时候看来也并非一件容易的事.最近通过学习< ...

  8. java 物理内存_聊聊Java中的内存

    JVM的内存 先放一张JVM的内存划分图,总体上可以分为堆和非堆(粗略划分,基于java8) 那么一个Java进程最大占用的物理内存为: Max Memory = eden + survivor + ...

  9. 独占设备的分配与回收_灵魂拷问:Java对象的内存分配过程是如何保证线程安全的?...

    点击上方"linkoffer", 选择关注公众号高薪职位第一时间送达 作者 l Hollis JVM内存结构,是很重要的知识,相信每一个静心准备过面试的程序员都可以清楚的把堆.栈. ...

最新文章

  1. 【UWP】拖拽列表项的排序功能实现
  2. ZooKeeper 3.4.5 分布式环境搭建详解
  3. @ComponentScan.Filter type的类型
  4. shell文件管理jenkins构建过程---window环境下报错:找不到shell文件
  5. 更深入地了解Java 8 Date and Time API
  6. 动态数组vector的使用_简单代码示例
  7. 计算机科学与技术 物联网工,北京科技大学计算机与通信工程学院-王睿
  8. 学校为什么要单位接收函_为什么要选择语言学校留学?
  9. 单向链表反转-JS实现
  10. firebug下载时出现there was an error loading firebug
  11. 大数据Hadoop技术的发展历史与未来前景
  12. android水果界面设计,一套小清新的水果元素的APP界面设计欣赏
  13. 【老生谈算法】matlab实现模糊K-均值算法——均值算法
  14. ubantu启动黑屏解决办法
  15. creo6.0安装教程
  16. javaScript中console.log()的用法
  17. 【NOI2015 Day1】软件包管理器
  18. 【Java】链表的基本操作
  19. 华为模拟器小型网络组建
  20. 入侵与模拟攻击(BAS)——新兴的安全防护有效性验证评估技术

热门文章

  1. 能骑能健身的折叠电动车,短途出行新利器,五轮健身电踏车D1 Pro体验
  2. 电脑解锁后黑屏有鼠标_电脑开机后黑屏只有鼠标怎么办
  3. python统计分析书籍_Python数据分析入门书籍推荐
  4. h5 虚拟服务器,h5制作选择虚拟主机还是服务器
  5. 虎牙盈利能力得到改善,但监管风险对其收入产生负面影响
  6. 如果你狂按F2,F12,DEL也进不了BIOS怎么办?
  7. 求一个数各个位数之和
  8. 测测你的眼睛对色差的辨识度?抱歉我开挂了……【JavaScript脚本实现找色差小游戏自动刷关】
  9. 1月第1周业务风控关注 | 四部门联合印发App违法违规收集使用个人信息行为认定方法
  10. 蓝桥 卷“兔”来袭编程竞赛专场-08列置换加密 题解