当前位置: 首页 > 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时若发现无引用,则通知系统直接内存可以垃圾回收了,然后这里具体垃圾回收由操作系统来处理。

相关文章:

  • 11 OpenCV图像识别之人脸识别
  • Winform控件开发(14)——NotifyIcon(史上最全)
  • 力扣mysql刷题记录
  • STM32开发(15)----芯片内部温度传感器
  • 2022 赣育杯 CTF --- Crypto Lost_N wp
  • 力扣-寻找用户推荐人
  • Kafka(7):生产者详解
  • Interview系列 - 06 Java | ArrayList底层源码分析 | 遍历集合时如何删除集合中的元素
  • redis(win版)
  • 【什么程度叫熟悉linux系统】
  • 带您了解TiDB MySQL数据库中关于日期、时间的坑
  • 为什么不建议用 equals 判断对象相等?
  • C/C++ 中#define 的妙用,让代码更美一些
  • 缺少IT人员的服装行业该如何进行数字化转型?
  • Spring Cloud Nacos源码讲解(二)- Nacos客户端服务注册源码分析
  • 复旦发布国内首个类ChatGPT模型MOSS,和《流浪地球》有关?
  • MyBatis基于XML的详细使用——动态sql
  • Qt 开发使用VSCode 笔记2
  • 算法分析详解
  • 进程间通信(二)/共享内存
  • 老人在健身中心晕倒获AED急救,上海检察机关为何被感谢?
  • 上海警方:男子拍摄女性视频后在网上配发诱导他人违法犯罪文字,被行拘
  • 上海浦东打造全新开放平台,年内实现基本功能落地运行
  • 创纪录!南向资金今年净流入已超6000亿港元,港股缘何被爆买?
  • 中国足协、中足联:对浙江队外援阿隆·布彭扎不幸离世表示深切哀悼
  • 肯尼亚总统鲁托将访华,外交部:中肯两国元首将举行会谈