直接内存

直接内存概述

  1. 不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。

  2. 直接内存是在 Java 堆外的、直接向系统申请的内存区间。

  3. 来源于 NIO,通过存在堆中的 DirectByteBuffer 操作 Native 内存

  4. 通常,访问直接内存的速度会优于 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;//1GBpublic 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 的本地内存!

BIO 与 NIO

非直接缓存区(BIO):原来采用BIO的架构,在读写本地文件时,我们需要从用户态切换成内核态。

直接缓冲区(NIO):直接操作物理磁盘,省去了中间过程。

直接内存与 OOM

  1. 直接内存也可能导致OutofMemoryError异常;
  2. 由于直接内存在Java堆外,因此它的大小不会直接受限于-Xmx指定的最大堆大小,但是系统内存是有限的,Java堆和直接内存的总和依然受限于操作系统能给出的最大内存;
  3. 直接内存的缺点为:分配回收成本较高和不受JVM内存回收管理;
  4. 直接内存大小可以通过MaxDirectMemorySize设置;
  5. 如果不指定,默认与堆的最大值-Xmx参数值一致。

OOM示例:

/*** 本地内存的OOM:  OutOfMemoryError: Direct buffer memory**/
public class BufferTest2 {private static final int BUFFER = 1024 * 1024 * 20;//20MBpublic static void main(String[] args) {ArrayList<ByteBuffer> list = new ArrayList<>();int count = 0;try {while(true){ByteBuffer byteBuffer = ByteBuffer.allocateDirect(BUFFER);list.add(byteBuffer);count++;try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}} finally {System.out.println(count);}}
}

异常输出:

Exception in thread "main" java.lang.OutOfMemoryError: Direct buffer memoryat java.nio.Bits.reserveMemory(Bits.java:694)at java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:123)at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:311)at com.heu.java.BufferTest2.main(BufferTest2.java:21)

简单理解:java process memory = java heap + native memory.

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. Tungsten Fabric SDN — 零宕机(ZIU)自动化运维
  2. java 面向对象 小练习
  3. Unix——百度百科
  4. python: 判断字符串是否为合法的json格式
  5. selenium 4_Selenium4 Alpha –期望什么?
  6. matlab resample,resample matlab实现
  7. cdh 差异_“Sahara/CDHPlugin”的版本间的差异
  8. 自动化测试selenum
  9. Gratipay如何帮助解决“搭便车”问题
  10. amd显卡更新最新驱动鼠标顿卡的解决方法
  11. jracdrive变频器说明书580_ABB变频器ACS580说明书.pdf
  12. 机器人读懂人心的九大模型
  13. 关于基金知识的一些整理
  14. chrome设置开启GPU加速
  15. python冒号亮红无效语法_新的python无效语法*更新
  16. 【源码】MATLAB计算流体动力学(CFD)GUI工具箱
  17. capacitor 安卓插件版本兼容问题
  18. 2022年2月halcon licenses
  19. 跟叶子学把妹——教程序猿把妹第三集
  20. Linux7.6安装Vnc

热门文章

  1. java安全插件_如何安全地实现Java插件安全性?
  2. 列举窗体控制台应用程序中的3中控件_今天来点枯燥的,Visual C#的Windows窗体运行过程...
  3. 大型网站技术架构(七)网站的可扩展性架构
  4. 阿里开发者招聘节 | 面试题14:如何实现两金额数据相加(最多小数点两位)...
  5. 滴滴进入寒冬期,将裁员2000人
  6. 分类回归loss函数汇总分析
  7. windows 下mysql的安装于使用(启动、关闭)
  8. Only the original thread that created a view hierarchy can touch its views.
  9. 华人世界——客家足迹行
  10. 关于sql中case when的用法