操作系统中的pagecache,jvm中文件的堆内存分配,堆外和mmap直接分配

Page cache
由内存中的物理page组成,其内容对应磁盘上的block。page cache的大小是动态变化的,可以扩大,也可以在内存不足时缩小。cache缓存的存储设备被称为后备存储(backing store),一个page通常包含多个block,这些block不一定是连续的。
pagecache可以大大加快文件的读写速度,一次读取或者写入4k的数据,节省了连接的各种开销。但是pagecache一般是写在内存中的,一旦断电或者是故障,数据会丢失。没办法保障数据一定是安全的,如果为了保障安全,不实用pagecache,那么性能会降低到无法接受。
在pagecache中,是有策略的,比如说,我给了2g的内存到这里,然后规定到50%再刷入磁盘中,那么,超过1g之后才会刷入磁盘,如果只有500m的page,这500m也称为脏页(dirty),此时断电,数据是会丢失的。如果超过2g的数据读入page中,也会通过常用的LRU算法,通过swap交换硬盘的空间,将最不常用的数据刷入swap区中。

操作系统中的pagecache,jvm中文件的堆内存分配,堆外和mmap直接分配

操作系统中的pagecache,jvm中文件的堆内存分配,堆外和mmap直接分配
position: 它指的是下一次读取或写入的位置。

limit: 指定还有多少数据需要写出(在从缓冲区写入通道时),或者还有多少空间可以读入数据(在从通道读入缓冲区时),它初始化是与capacity的值一样,当调用flip()方法之后,它的值会改变成position的值,而position被置0。它箭头所指的位置是最后一位元素的下一位所在的位置*

capacity: 指定了可以存储在缓冲区中的最大数据容量,实际上,它指定了底层数组的大小,或者至少是指定了准许我们使用的底层数组的容量,这个初始化后就不会再改变了。

java的jvm对于os来说,其实就相当于一个普通的程序,对于文件的读写来说,一个object