直接内存

特点

  • 不属于Java虚拟机管理,属于系统内存;
  • 属于操作系统,常见于NIO操作时,比如ByteBuffer【】用于数据缓冲区
  • 分配回收成本较高,但读写性能高;
  • 不受JVM内存回收管理

文件读写过程

java不具备磁盘读写的能力,因此需要调用操作系统提供的方法;java函数->本地方法用户态->内核态

弊端:需要在系统内存和java堆内存都复制一份磁盘文件,浪费空间也降低传输效率

直接内存是在系统内存和Java堆内存之间开辟出的一块共享区域,可以供操作系统和java代码访问。

好处:只需要缓冲一份磁盘文件,效率更高

内存溢出

​ 直接内存也会存在内存溢出的问题,比如下面的例子,在循环中不断申请一个100m的直接内存空间,把其加入list中,最终会造成直接内存不够,抛出直接内存溢出异常

可以在任务管理中查看到当前直接内存的大小

直接内存释放原理

java底层使用Unsafe类来分配释放直接内存,一般是jdk内部使用

//通过ByteBuffer申请100M的直接内存
//容量默认单位为字节Byte
int _100M = 1024*1024;
ByteBuffer byteBuffer=ByteBuffer.allocateDirect(_100M);

allocateDirect实现过程

/*** Allocates a new direct byte buffer.* @param  capacity*         The new buffer's capacity, in bytes*/
public static ByteBuffer allocateDirect(int capacity) {   return new DirectByteBuffer(capacity);
}

DirectByteBuffer实现过程

  • 调用 UNSAFE.setMemory(base, size, (byte) 0);来分配直接内存
  • cleaner = Cleaner.create(this, new Deallocator(base, size, cap));
  • 调用 UNSAFE.freeMemory(address);来释放直接内存
// Primary constructor
//
DirectByteBuffer(int cap) {                   // package-privatesuper(-1, 0, cap, cap, null);boolean pa = VM.isDirectMemoryPageAligned();int ps = Bits.pageSize();long size = Math.max(1L, (long)cap + (pa ? ps : 0));Bits.reserveMemory(size, cap);long base = 0;try {base = UNSAFE.allocateMemory(size);} catch (OutOfMemoryError x) {Bits.unreserveMemory(size, cap);throw x;}UNSAFE.setMemory(base, size, (byte) 0);if (pa && (base % ps != 0)) {// Round up to page boundaryaddress = base + ps - (base & (ps - 1));} else {address = base;}cleaner = Cleaner.create(this, new Deallocator(base, size, cap));att = null;}

Deallocator的实现过程

public void run() {if (address == 0) {// Paranoiareturn;}UNSAFE.freeMemory(address);address = 0;Bits.unreserveMemory(size, capacity);
}

cleaner是虚引用类型,当被关联的对象(ByteBuffer)被java垃圾回收时,会触发cleaner的clean方法,执行 Deallocator任务对象的run方法,即最终调用 UNSAFE.freeMemory(address);

禁用显示回收堆直接内存的影响

代码中的System.gc是****显示垃圾回收,是一次Full GC 比较耗时,影响程序执行;可以使用命令**禁用显示回收,**但是会造成ByteBuffer对象存活,直接内存无法释放,造成长时间得不到释放的问题。

解决方法:直接使用Unsafe调用FreeMemory手动释放 UNSAFE.freeMemory(address);

可以使用命令**禁用显示回收,**但是会造成ByteBuffer对象存活,直接内存无法释放,造成长时间得不到释放的问题。

解决方法:直接使用Unsafe调用FreeMemory手动释放 UNSAFE.freeMemory(address);

直接内存 直接内存的释放和回收相关推荐

  1. python 释放变量所指向的内存_通俗易懂的Python垃圾回收机制及内存管理

    Python垃圾回收机制及内存管理 内存管理: 先定义一个变量 name='wxl' 那么python会在内存中开辟一小块区域存放"wxl",此时变量的值是我们真正想要存储的,wx ...

  2. C#内存释放(垃圾回收)

    C#内存释放(垃圾回收) 问题背景---- 今天写了个很小的程序,程序的功能仅仅是截图,但是如果长时间开启并截图的时候,程序会变的很大,从刚开始的运行在任务管理器中只有十几K大小,运行一段时间后在任务 ...

  3. android释放acitity内存,Android 内存泄漏分析与解决方法

    在分析Android内存泄漏之前,先了解一下JAVA的一些知识 1. JAVA中的对象的创建 使用new指令生成对象时,堆内存将会为此开辟一份空间存放该对象 垃圾回收器回收非存活的对象,并释放对应的内 ...

  4. linux 用户进程结束后 malloc申请的内存会自动释放吗,进程退出后malloc的内存是否会被释放?

    当一个进程退出后,不管是正常退出或者是异常退出,操作系统都会释放这个进程的资源.包括这个进程分配的内存,打开的文件等等. 内存泄露的前提是进程一直在运行:进程一旦退出,所占的整个虚拟内存都被销毁,所有 ...

  5. C#内存泄露与资源释放 经验总结

    本文链接:http://blog.csdn.net/yokeqi/article/details/41083939 C#相比其他语言,拥有强大的垃圾回收机制,但并不是这样,你就可以对内存管理放任不管, ...

  6. 第六讲:Obj-C 内存管理4 - 自动释放池

    转:http://tigercat1977.blog.163.com/blog/static/2141561122012111294616203/ 第六讲:Obj-C 内存管理4 - 自动释放池 主要 ...

  7. C++动态内存会被自动释放吗?

    C++动态内存会被自动释放吗? 函数体内的局部变量在函数结束时自动消亡.很多人误以为示例7-6是正确的.理由是p是局部的指针变量,它消亡的时候会让它所指的动态内存一起完蛋.这是错觉! void Fun ...

  8. JVM内存模型、原理、垃圾回收、调优

    JVM内存模型.原理.垃圾回收.调优,这Java语言的基础,作为Java从业人员是必须要掌握的,另外这也是面试经常会问到的知识. ----------------------------------- ...

  9. 【Unity】Unity内存管理与优化(一)内存域、堆栈、垃圾回收、内存泄漏、内存碎片

    文章目录 Unity内存 内存域 - 托管域 - 本地域 - 外部库 - 跨桥操作 堆和栈 - 栈 - 堆 - 堆栈的使用 垃圾回收 - Mono内存分配过程 - 内存泄漏 - 内存碎片 - 运行时垃 ...

  10. [内核内存] [arm64] 内存回收2---快速内存回收和直接内存回收

    文章目录 内存紧张回收 快速内存回收 struct scan_control结构体 __node__reclaim函数介绍 快速内存回收注意事项和小结 直接内存回收 __perform_reclaim ...

最新文章

  1. 《设计模式 系列》- 面向对象六大原则
  2. FPGA/IC Technology Exchange
  3. CSDN开源夏令营 百度数据可视化实践 ECharts(8)
  4. python实现项目的复制_Python之copy模块
  5. 系统设计知识:系统模块结构设计知识笔记
  6. CONTINUE...? ZOJ - 4033
  7. java 链表算法_数据结构算法Java版(一) 链表
  8. cmake之TEST与TEST_F用法(五)
  9. 拓端tecdat|Excel实例:排序和筛选2
  10. linux登录显示 Error in service module错误
  11. java生成图表_java实现将数据生成图表至excel导出
  12. linux用户及组管理实训,实训 Linux下用户和组的管理和权限命令操作.doc
  13. Heartbeat安装部署
  14. 《我爱我的祖国》受捧 再现专线另类舌尖上中国
  15. win10 .Net Runtime Optimization Service占用大量CPU资源解决方法
  16. 人工神经网络预测血药浓度计算公式
  17. Win10休眠后蓝牙键盘无法唤醒怎么办?
  18. 用单片机的RAM虚拟U盘(文件系统:Fat16)
  19. 初探Java设计模式------观察者模式
  20. 把计算机器显示桌面,怎样将电脑显示器和桌面匹配

热门文章

  1. vue table自定义样式
  2. Centos7.6离线安装显卡驱动
  3. ML-Diary02
  4. matlab读取声音文件
  5. hosts屏蔽网站以及代理越过屏蔽
  6. 关于举办“第五届全国现代物流绿色包装与循环共用大会”的通知
  7. AO3401-ASEMI场效应管AO3401
  8. 【转】西门子数控系统中MMC、PCU、NCU、CCU简略介绍
  9. 【计算机视觉】相机标定原理(像素点与三维坐标点的转换)
  10. 中国 IM 企业的新机会?揭秘融云全球通信云网络背后的技术 | 对话 WICC