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(