美文网首页
为什么要内存回收?

为什么要内存回收?

作者: 迷死她张 | 来源:发表于2019-04-14 16:39 被阅读0次

Linux内核会使用内存中的page cache对部分文件进行缓存,以便提升文件的读写效率。所以内核需要设计一个周期性回收内存的机制,以便让cache的使用和其他相关内存的使用不至于让系统的剩余内存长期处于很少的状态。

这是第一点,还有一点就是当真的有大于空闲内存的申请到来的时候,内核会触发强制内存回收。

所以,内核在应对这两类回收的需求下,分别实现了两种不同的机制。一个是使用kswapd进程对内存进行周期检查,以保证平常状态下剩余内存尽可能够用。另一个是直接内存回收(direct page reclaim),就是当内存分配时没有空闲内存可以满足要求时,触发直接内存回收。

这两种内存回收的触发路径不同,一个是由内核进程kswapd直接调用内存回收的逻辑进行内存回收(参见mm/vmscan.c中的kswapd()主逻辑),另一个是内存申请的时候进入slow path的内存申请逻辑进行回收(参见内核代码中的mm/page_alloc.c中的__alloc_pages_slowpath方法)。这两个方法中实际进行内存回收的过程殊途同归,最终都是调用shrink_zone()方法进行针对每个zone的内存页缩减。这个方法中会再调用shrink_lruvec()这个方法对每个组织页的链表进程检查。找到这个线索之后,我们就可以清晰的看到内存回收操作究竟针对的page有哪些了。

另外,内存回收这个行为会对两种内存的使用进行回收,一种是anon的匿名页内存,主要回收手段是swap,另一种是file-backed的文件映射页,主要的释放手段是写回和清空。因为针对file based的内存,没必要进行交换,其数据原本就在硬盘上,回收这部分内存只要在有脏数据时写回,并清空内存就可以了,以后有需要再从对应的文件读回来。内存对匿名页和文件缓存一共用了四条链表进行组织,回收过程主要是针对这四条链表进行扫描和操作。

相关文章

  • JVM:垃圾收集器与内存分配策略(上)

    概述 要研究的问题 回收哪些内存 什么时候回收 如何回收 为什么要了解GC和内存分配:需要排查各种内存溢出、内存泄...

  • JVM - GC

    GC:垃圾回收 Q1:为什么要垃圾回收? 为了腾出内存给其他对象。 Q2:回收谁?(谁是垃圾?) 堆内存中,没有被...

  • jvm之收集器

    JVM为什么要进行垃圾回收? 如果不进行垃圾回收,内存迟早都会被消耗空,因为我们在不断的分配内存空间而不进行回收。...

  • 常见GC算法与V8引擎

    内存管理 垃圾回收与常见GC算法 V8引擎的垃圾回收 Performance工具 代码优化实例 内存管理 为什么要...

  • 为什么要内存回收?

    Linux内核会使用内存中的page cache对部分文件进行缓存,以便提升文件的读写效率。所以内核需要设计一个周...

  • 性能优化<第五篇>:内存优化

    1、为什么要内存优化? 2、了解内存中的内容 3、内存上限 4、GC内存回收机制 5、内存泄漏、内存抖动、内存溢出...

  • JVM垃圾回收机制

    JVM垃圾回收机制 垃圾回收需要考虑的三件事: 哪些内存需要回收; 什么时候回收; 如何回收; 为什么要学习GC呢...

  • 优化你的内存

    这篇文章主要介绍 V8 的内存管理和垃圾回收知识。(总结来自网易课堂) V8引擎内存回收机制 为什么我们要关注内存...

  • JVM系列——垃圾收集(一)

    垃圾收集 哪些内存需要回收? 什么时候回收? 怎么回收? 为什么需要了解垃圾收集呢? 当需要排查各种内存溢出、内存...

  • Java 垃圾收集(GC)浅谈

    Java 垃圾收集(GC)浅谈 为什么需要垃圾回收?哪些内存需要回收?什么时候回收?如何回收? 为什么需要垃圾回收...

网友评论

      本文标题:为什么要内存回收?

      本文链接:https://www.haomeiwen.com/subject/ttdswqtx.html