JVM基础篇-直接内存

JVM基础篇-直接内存

什么是直接内存?

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

传统方式读取文件

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

利用直接内存读取文件

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

直接内存溢出

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

探究ByteBuffer

  • 演示Unsafe对象的使用
java 复制代码
/**
 * @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对象手动回收这部分内存

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

总结

  • 使用了 Unsafe 对象完成直接内存的分配回收,并且回收需要主动调用 freeMemory 方法
  • ByteBuffer 的实现类内部,使用了 Cleaner (虚引用)来监测 ByteBuffer 对象,一旦ByteBuffer 对象被垃圾回收,那么就会由 ReferenceHandler 线程通过 Cleaner 的 clean 方法调用 freeMemory 来释放直接内存
相关推荐
月华路3 小时前
G1 GC 对数组与大对象(Humongous)的处理
java·jvm·算法
月华路8 小时前
G1 新生代对象晋升老年代:实现机制与 GC 日志
java·jvm·算法
Shadow(⊙o⊙)9 小时前
C++进阶知识5.0
jvm
一木 之林11 小时前
五、C++新特性、关键字与编译原理
java·jvm·算法
Mr. zhihao11 小时前
线上卡顿排查决策手册:场景 × 命令 × 现象 × 调整方案
java·开发语言·jvm
Nontee15 小时前
Excel 导出组件改造实录:从 Full GC 到声明式导出
jvm·excel
牛油果子哥q15 小时前
C++异常处理万字详解:try-throw-catch机制、栈展开、标准异常体系、自定义异常、工程规范、内存泄漏避坑
开发语言·jvm·c++
leisoo80971 天前
ig50数据落盘ClickHousevsTimescaleDBvsDuckDB实测对比 IG50免费开源股票数据API接口
开发语言·jvm·数据库·python·json
今天的砖头有点烫手啊1 天前
JVM 调优实战:从 GC 日志到参数优化,一次完整排查
java·jvm