1\如何理解LRU内存回收
三种内存回收机制
1\基于LRU算法,回收缓存
2\基于swap机制,回收不常访问的匿名页
3\基于OOM机制,杀掉占用大量内存的进程
第一和第二中都是使用了LRU算法,回收掉不常访问的内存,LRU算法,实际上维护这两个双向链表(active,和inactive)
active记录活跃的内存页
inactive记录不活跃的内存页
越接近链表尾部,就表示内存页越不常访问,这样在内存回收时,就可以根据活跃进程度,优先回收不常访问的内存
OOM机制:按照oom_score给进程排序,oom_score越大,进程就越容易被系统杀死,当系统发现内存不足以分配新的内存请求时,就会尝试直接内存回收,在这种情况下,如果回收完,文件页和匿名页,内存还是不足的话,OOM就会直接杀死进程
dmesg | grep -i 查看被OOM杀死的进程
"Out of memory"Out of memory: Kill process 9329 (java) score 321 or sacrifice child
如果不希望程序被OOM杀死,可以调整oom_score_adj,减少OOM分值,进而降低进程被杀死的概率,,或者,开启内存的overcommit,允许进程申请超过物理内存的虚拟内存
2\回收后的内存去了那里
内存回收之后,会被放到未使用的内存中,这样新的进程就可以去使用他们
3\OOM是按照虚拟内存还是实际内存来打分
OOM触发的时机是基于虚拟内存,进程在申请内存时,如果申请的虚拟内存,加上服务器的已用的内存之和,比总的物理内存还要大,就会触发OOM
4\怎么评估应用程序的最小内存
在程序运行的过程中,通过ps或者是smap,查看他内存的使用情况,
文件系统与磁盘的区别
磁盘是一个存储设备,可以划分为不同的磁盘分区,而磁盘或者磁盘分区上还可以创建文件系统,并挂载到系统的某个目录中.这样,系统就可以通过这个挂载目录去读写文件了
简单来说:磁盘是存储数据的块设备.也是文件的载体,.所以文件确实需要磁盘来保证数据的持久化存储
在读写普通文件的时候,I/O请求会先经过文件系统,然后由文件系统负责,来与磁盘进行交互,而在读写块设备文件的时候,会跳过文件系统,直接与磁盘交互,也就是所谓的裸I/O
这两种读写文件的缓存自然不同,文件系统管理的缓存,其实就是Cache的一部分,而裸磁盘缓存,用的就是Buffer