当前位置: 首页 > news >正文

JVM基础篇-直接内存

JVM基础篇-直接内存

什么是直接内存?

直接内存( 堆外内存 ) 指的是 Java 应用程序通过直接方式从操作系统中申请的内存,这块内存不属于jvm

传统方式读取文件

在这里插入图片描述

  • 首先会从用户态切换到内核态,调用操作系统函数从磁盘读取文件,读取一部分到操作系统缓冲区中
  • 然后从内核态切换到用户态,从系统缓冲区复制数据到Java堆缓冲区中

利用直接内存读取文件

在这里插入图片描述

  • 首先会从用户态切换到内核态,调用操作系统函数从磁盘读取文件,读取一部分到直接内存中
  • java可以直接访问直接内存,而不用进行再次复制,从而效率得到成倍提升

直接内存溢出

在这里插入图片描述

直接内存也会出现内存溢出,所以使用时需要小心

探究ByteBuffer

  • 演示Unsafe对象的使用
/*** @apiNote 直接内存是通过Unsafe对象的freeMemory方法完成内存释放而不是通过JVM自动垃圾回收*/
public class Demo10 {static int _1GB = 1024 * 1024 * 1024;public static void main(String[] args) throws Exception {Unsafe unsafe = getUnsafe();long base = unsafe.allocateMemory(_1GB);//分配直接内存,返回内存地址unsafe.setMemory(base, _1GB, (byte) 0);System.in.read();unsafe.freeMemory(base);//释放内存System.in.read();}public static Unsafe getUnsafe() {try {Field f = Unsafe.class.getDeclaredField("theUnsafe");f.setAccessible(true);Unsafe unsafe = (Unsafe) f.get(null);return unsafe;} catch (NoSuchFieldException | IllegalAccessException e) {throw new RuntimeException(e);}}
}

ByteBuffer是怎么声明直接内存和回收内存的呢?

在这里插入图片描述

  • 可以看出底层声明内存采用Unsafe对象声明,而垃圾回收交给Cleaner对象进行管理

在这里插入图片描述

  • 当虚ByteBuffer对象被回收时,会自动触发任务的run方法,该run方法会自动调用Unsafe对象的释放内存方法

在这里插入图片描述

🔖当jvm设置为禁用显式的垃圾回收时,直接内存只有到下次真正的垃圾回收时才会被释放,需要解决这个问题可以通过Unsafe对象手动回收这部分内存

-XX:+DisableExplicitGC //禁用显式的垃圾回收 相当于禁用System.gc()

总结

  • 使用了 Unsafe 对象完成直接内存的分配回收,并且回收需要主动调用 freeMemory 方法
  • ByteBuffer 的实现类内部,使用了 Cleaner (虚引用)来监测 ByteBuffer 对象,一旦ByteBuffer 对象被垃圾回收,那么就会由 ReferenceHandler 线程通过 Cleaner 的 clean 方法调用 freeMemory 来释放直接内存
http://www.lryc.cn/news/108936.html

相关文章:

  • 【Java可执行命令】(十四)脚本执行工具jrunscript :在命令行环境下交互式执行一些简单的脚本或测试代码片段~
  • eclipse Java Editor Templates
  • vue SKU已知sku.tree算出sku.list类目值和id
  • error C4430 缺少类型说明符 - 假定为 int。注意 C++ 不支持默认 int
  • Embedding入门介绍以及为什么Embedding在大语言模型中很重要
  • 暑假刷题第20天--8/3
  • docker容器内的django启动celery任务队列
  • linux文件描述符fd
  • 【深度学习】各个开源库总结及实战-总目录
  • Unity Shader:闪烁
  • c++开发模式桥接模式
  • javaScript 树形结构 递归查询方法。
  • MySQL语法2
  • Mysql on duplicate key update用法及优缺点
  • 【Linux】-进程概念之进程优先级(如何去进行调度以及进程切换),还不进来看看??
  • 《在细雨中呼喊》阅读笔记
  • 01-1 搭建 pytorch 虚拟环境
  • RocketMQ 事务消息
  • Windows安装ElasticSearch
  • 【深度学习】SMILEtrack: SiMIlarity LEarning for Multiple Object Tracking,论文
  • 【Kubernetes】Kubernetes之二进制部署
  • 京东开源的、高效的企业级表格可视化搭建解决方案:DripTable
  • STL C++学习背景
  • C#踩坑:谨慎在XML数据列上绑定鼠标事件!
  • 逻辑代数运算
  • win10笔记本显示器根据页面显示亮度自动调节亮度的问题
  • 无人驾驶实战-第一课(自动驾驶概述)
  • 15.节点操作
  • C语言自定义类型 — 结构体、位段、枚举、联合
  • 新手指南:流程图中各种图形的含义及用法解析