【JVM虚拟机】- 03内存结构之直接内存

Direct Memory

一、直接内存

1.1定义

​ 直接内存(Direct Memory):是一块操作系统中的内存,不受JVM管理,常用于NIO操作的数据缓冲

​ 分配回收成本高(资源占用高),但是读写性能高(速度快)

1.2与传统内存比较

解析:与传统内存模式不同的一点是,多出了一块直接内存缓存区,这块区域是Java内存和系统内存都可以直接调用,不用

像之前要复制到Java内存去运行

案例:NIO的 ByteBuffer类所用到的直接内存引用以及释放

public class test02_byteBufferDirectMemory {
    static int _1Gb = 1024*1024*1024;
    public static void main(String[] args) throws IOException {
        ByteBuffer byteBuffer  =  ByteBuffer.allocateDirect(_1Gb);
        System.out.println("分配完毕");
        System.in.read();
        System.out.println("开始释放");
        byteBuffer = null;
        System.gc();
        System.in.read();
    }
}

解析源码:

​ 1.首先这个类的资源不会被GC所回收,因为它是属于直接内存区域,不涉及GC,

​ 这个类真正释放资源的代码是一个叫做 unsafe对象的 freeMemory 方法

​ 2.具体的实现在allocateDirect方法,进入之后会看到又调用了DirectByteBuffer类

在这里插入图片描述

​ 3.进入DirectByteBuffer类后会看到 有unsafe对象出现了,并且核心代码是一个cleaner(虚引用)类,cleaner的create方法

​ 会传入当前的DirectByteBuffer对象,以及一个回调方法

在这里插入图片描述

​ 4.进入到回调方法,终于看到了要执行的 unsafe.freeMemory

在这里插入图片描述

​ 5.接下来就是Cleaner类要做的,当释放资源时,ReferenceHandler线程(守护线程)会调用cleaner的clean方法,

​ 然而在clean方法里,就看到了调用传入runnable接口对象的run方法,然后就去执行freeMemory了

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值