内存回收与OOM

 

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

 

上一篇:阿里面试官鬼得很,问我为什么他们要禁用Executors创建线程池?


下一篇:一文了解OOM及解决方案,终获offer