# JVM - 直接内存

JDK版本:1.8

# 1、直接内存(Direct Memory)

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

​ 在JDK 1.4版本中引入了NIO类,引入了一种基于通道(Channel)于缓冲区(Buffer)的I/O方式,它可以直接调用Native函数分配堆外内存空间,然后通过存储在堆中的DirectByteBuffer对象作为这块空间的引用以此来对其进行操作。这样就避开了JVM于操作系统之间的内存屏障,减少了在Java堆与Native堆中进行来回复制的额外开销,在某些场景中可以显著提高性能。同时访问直接内存的速度也会优于Java堆,即读写性能高。

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

​ 也正是因为直接内存不是虚拟机运行时数据区的一部分,直接内存不受JVM内存回收管理,所以其分配回收成本也较高。直接内存大小可通过MaxDirectMemorySize选项进行配置,如果不进行指定默认与堆空间的-Xmx参数值保持一致。

# 2、直接内存与非直接内存差异

使用非直接内存进行IO读写文件时,需要与物理磁盘进行交互。在执行读写操作时,JVMOS直接存在内存屏障,所以进行数据的交互时就会进行来回复制。换而言之就是需要由用户态切换到内核态,内核态中需要同时维护两份重复数据,这样带来的额外性能开销是非常大的。

如下为非直接内存JVMOS之间的数据交互图:

使用直接内存进行IO读写文件时,直接调用Native函数分配堆外内存空间,并且这部分内存可以通过存储在堆中的DirectByteBuffer对象对其进行操作,避免了内存屏障同时也只需要维护一份数据。避免了不必要的性能开销。

如下为直接内存JVMOS之间的数据交互图:

JVM - 直接内存相关推荐

  1. 《深入理解Java虚拟机》(第二版)学习1:JVM的内存划分

    运行时数据区 先来一张图描述一下 JVM 的内存划分 PS:自己画的,丑是难免丑了点- 程序计数器(Program Counter Register) 程序计数器(Program Counter Re ...

  2. 调整JVM堆内存解决OutOfMemoryError

    今天在用 processing(http://zh.wikipedia.org/wiki/Processing) 编写处理 midi 文件的程序的时候,遇到了一个问题.程序主要是读取分析 midi , ...

  3. JVM之内存结构图文详解

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 对于开发人员来说,如果不了解Java的JVM,那真的是很难写得一手好代码,很难查得一手好bu ...

  4. Java之JVM的内存分配策略

    周末有小伙伴留言说上周面试时被问到内存分配策略的问题,但回答的不够理想,小伙伴说之前公号里看过这一块的文章的,当时看时很清楚,也知道各个策略是干嘛的,但面试时脑子里清楚,心里很明白,但嘴里就是说不清楚 ...

  5. Linux与JVM的内存关系分析

    Linux与JVM的内存关系分析 原文出处: 美团技术团队 引言 在一些物理内存为8g的服务器上,主要运行一个Java服务,系统内存分配如下:Java服务的JVM堆大小设置为6g,一个监控进程占用大约 ...

  6. jvm垃圾内存回收问题

    CrashReport系统在游戏内测当天出现了异常情况JVM僵死,通过top -p <PID> -H 结合jstack(jstack -m -l pid)查看,发现是VM Thread线程 ...

  7. JVM 的内存模型及jstat命令的使用

    目录 JVM的内存模型 jdk1.7的内存模型 jdk1.8的内存模型 为什么要废弃1.7中的永久代? 通过jstat命令查看堆内存使用情况 查看class加载统计 查看编译统计 垃圾回收统计 JVM ...

  8. modeler java堆空间,JVM|02内存模型

    JVM内存模型 概述 Java内存模型(Java Memory Model ,JMM)就是一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,保证了Java程序在各种平台下对内存的访问都能保 ...

  9. JVM的内存结构,Eden和Survivor比例;JVM中一次完整的GC流程,对象如何晋升到老年代,说说你知道的几种主要的JVM参数;CMS 常见参数解析;.你知道哪几种垃圾收集器,各自的优缺点

    47.JVM的内存结构,Eden和Survivor比例 49.JVM中一次完整的GC流程是怎样的,对象如何晋升到老年代,说说你知道的几种主要的JVM参数 50.-XX:+CMSScavengeBefo ...

  10. JVM的内存区域划分(转)

    原文链接:JVM的内存区域划分 JVM的内存区域划分 学过C语言的朋友都知道C编译器在划分内存区域的时候经常将管理的区域划分为数据段和代码段,数据段包括堆.栈以及静态数据区.那么在Java语言当中,内 ...

最新文章

  1. android canvas绘制圆角_Android自定义View撸一个渐变的温度指示器(TmepView)
  2. header(Content-Type:text/html;charset=utf-8);
  3. 《剑指offer》c++版本 12. 矩阵中的路径
  4. 三种SQLServer分页查询语句笔记
  5. 第四届cccc团体程序设计天梯赛
  6. 程序员的进阶课-架构师之路(大纲)-思维导图
  7. CABasicAnimation 按home键后台之后,再切回来动画就停止
  8. C++执行shell命令
  9. 5万字、97 张图总结操作系统核心知识点
  10. 思科三层交换机配置命令
  11. 中间件系列七 RabbitMQ之header exchange(头交换机)用法
  12. PowerShell报错:无法加载文件C:\Users\server\Documents\windowsPowerShell\profile.ps1...
  13. 泰拉瑞亚 阿里云服务器搭建记录
  14. 2.字节跳动2019雀魂启动
  15. java/php/net/python学生社团管理系统设计
  16. android_基础_Edittext的setSelection属性
  17. Test OpenStack SRIOV (by quqi99)
  18. 你怎么看待互联网创业的国外问卷调查?
  19. 安装麦咖啡8.7出现--错误1920,怎么办? 解决办法
  20. 设计模式(注重理解为什么),

热门文章

  1. PE保温管申请M1测试是根据NFP 92-507测试吗?
  2. UE4 Socket多线程非阻塞通信【1】
  3. 可爱的小老鼠计算机教案,小班音乐鼠标小老鼠教案
  4. vue element upload组件 file-list的动态绑定
  5. HACK RF学习之旅记录1——填坑历程
  6. Unity UI架构设计理念
  7. Tensorflow书推荐,深度学习书推荐
  8. 开发中Base64编码运用
  9. 计算机网络与协议实验VLAN配置,计算机网络实验三虚拟局域网vlan划分与配置
  10. 程序员:如何优雅地装逼