循序渐进理解Java直接内存回收

本文深入探讨Java直接内存的使用,包括直接内存的作用链、内存分配与回收原理,重点解析了自动回收与手动回收的过程,同时展示了直接内存与非直接内存的性能测试对比。
摘要由CSDN通过智能技术生成

1.堆外内存定义:

    堆外内存是相对于堆内内存的一个概念,堆内内存是由JVM所掌控的Java进程内存,我们平时在Java中创建的对象都处于堆内内存中,并且他们遵 循JVM的内存管理机制,JVM会采用垃圾回收机制统一管理它们的内存,那么堆外内存就是存在于JVM管控之外的一块内存区域,因此,它不直接虚拟机被管控。

核心API学习:
public class DirectByteBufferTest1 {

    public static void main(String[] args) {
        testRemaing();
    }

    /**
     * Position的位置是插入数据的当前位置,如果插入数据,就会自动后移.
     *
     * 也就是说,如果存储的是两个字节的数据,position的位置是在第三个字节上,下标就是2。
     */
    public static void testPosition(){
        ByteBuffer byteBuffer = ByteBuffer.allocateDirect(1024);
        byteBuffer.putChar('a');
        System.out.println(byteBuffer);
        byteBuffer.putChar('b');
        System.out.println(byteBuffer);
        byteBuffer.putInt(10);
        System.out.println(byteBuffer);
    }

    /**
     * capacity是当前申请的直接内存的容量,它是申请后就不会改变的。
     */
    public static void testPosition1(){
        ByteBuffer byteBuffer = ByteBuffer.allocateDirect(1024);
        System.out.println("capacity:" + byteBuffer.capacity());
    }

    /**
     * 改变这段直接内存的大小,注意limit要比mark和position大,比capacity小.
     */
    public static void testLimit(){
        ByteBuffer byteBuffer = ByteBuffer.allocateDirect(1024);
        System.out.println(byteBuffer.limit());
        byteBuffer.limit(1000);
        System.out.println(byteBuffer.limit());
    }

    /**
     *  mark,就是一个标记为而已,记录当前的position的值。常用的场景,就是记录某一次插入数据的位置,方便下一次进行回溯。
     */
    public static void testMark(){
        ByteBuffer buffer = ByteBuffer.allocateDirect(1024);
        buffer.putChar('a');
        buffer.putChar('c');
        System.out.println("插入完数据 " + buffer);
        // 记录mark的位置
        buffer.mark();
        // 设置的position一定要比mark大,否则mark无法重置
        buffer.position(30);
        System.out.println("reset前 " + buffer);
        // 重置reset ,reset后的position=mark
        buffer.reset();
        System.out.println(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值