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

JVM笔记(8)—— 直接内存

一、什么是直接内存

直接内存不是虚拟机运行时数据区的一部分,是在运行时数据区外、直接向系统申请的内存空间。

通常,访问直接内存的速度会优于堆,读写性能更好。因此,出于性能考虑,读写频繁的场合可能会考虑使用直接内存。Java的NIO库允许Java程序使用直接内存,用于数据缓冲区。

普通IO写需要从用户缓存空间copy到内核缓存空间再copy到磁盘(读就是反过来),而NIO是直接与磁盘进行交互,因此速率更快,适合对大文件的读写操作。

二、直接内存的简单使用

1. 使用ByteBuffer.allocateDirect()方法

    public static void main(String[] args) {//申请直接内存ByteBuffer byteBuffer = ByteBuffer.allocateDirect(1024*1024*1024);System.out.println("内存分配完毕");Scanner scanner = new Scanner(System.in);scanner.next();System.out.println("直接内存开始释放");byteBuffer = null;System.gc();scanner.next();}

2. 使用Unsafe对象的allocateMemory()方法

ByteBuffer.allocateDirect()方法内部也是通过Unsafe对象的allocateMemory()方法来分配内存的。

    public static void unSafeTest() throws IllegalAccessException {//无法使用,其内部通过判别当前类加载器限制了这个方法的调用
//      Unsafe unsafe = Unsafe.getUnsafe();//通过反射构造unsafe对象Field unsafeField = Unsafe.class.getDeclaredFields()[0];unsafeField.setAccessible(true);Unsafe unsafe = (Unsafe)unsafeField.get(null);int count = 0;while (true) {unsafe.allocateMemory(1024*1024*1024);System.out.println(++count);}}

三、直接内存的大小设置与内存溢出

直接内存可通过MaxDirectMemorySize设置,如果不指定,则默认与堆的-Xmx参数值一致。

使用时若超出最大内存则会抛出OutOfMemoryError。

四、直接内存的回收

直接内存不受JVM内存管理,分配和回收成本较高。

直接内存不受gc控制,是通过虚引用和引用计数判断,gc时若发现无引用,则通知系统直接内存可以垃圾回收了,然后这里具体垃圾回收由操作系统来处理。

http://www.lryc.cn/news/17611.html

相关文章:

  • Unity性能优化:如何优化Drawcall
  • 类与对象(this 关键字、构造器)
  • [NOIP2002 普及组] 过河卒
  • redis事务和锁机制
  • Java实例——线程
  • 云计算学习课程——越来越重要的云安全
  • Android 高性能列表:RecyclerView + DiffUtil
  • 为什么派生类的构造函数必须在初始化列表中调用基类的构造函数
  • 2023年2月初某企业网络工程师面试题【建议收藏】
  • 分布式下(sso)单点登录
  • PMP真的有那么厉害?你需要考PMP吗?
  • 高通平台开发系列讲解(WIFI篇)802.11 基本概念
  • 扬帆优配|反弹涨超70%,昨收三连板,稀土行业或迎大事件
  • 华为OD机试 - 工号不够用了(Java) | 机试题+算法思路+考点+代码解析 【2023】
  • Python学习-----lambda式匿名函数
  • 华为OD机试真题Python实现【求解连续数列】真题+解题思路+代码(20222023)
  • 每日学术速递2.22
  • postgresql 数据库 主从切换 测试
  • 干旱预测方法总结及基于人工神经网络的干旱预测案例分析(MATLAB全代码)
  • 一篇文章弄清楚啥是数组和集合
  • 计算机网络(五):三次握手和四次挥手,TCP,UDP,TIME-WAIT,CLOSE-WAIT,拥塞避免,
  • 【数据结构】二叉树(C语言实现)
  • 高级信息系统项目管理(高项 软考)原创论文——成本管理(2)
  • 代码签名即将迎来一波新关注
  • 黑盒渗透盲打lampiao
  • 笔记:VLAN及交换机处理详细教程(Tagged, UnTagged and Native VLANS Tutorial)
  • 在字节跳动,造赛博古籍
  • Android 12.0设置默认Launcher安装一款Launcher默认Launcher无效的解决方案
  • 数据结构第16周 :( 希尔排序+ 堆排序 + 快速排序 )
  • 【C++】类和对象