首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux内存回收和交换

前言 Linux的swap相关部分代码从2.6早期版本到现在的4.6版本在细节之处已经有不少变化。本文讨论的swap基于Linux 4.4内核代码。...Linux内存管理是一套非常复杂的系统,而swap只是其中一个很小的处理逻辑。希望本文能让读者了解Linux对swap的使用大概是什么样子。...所以系统默认将swappiness的值设置为60,这样回收内存时,对file-backed的文件cache内存的清空比例会更大,内核将会更倾向于进行缓存清空而不是交换。...那么如何描述内存使用的压力呢?Linux内核使用水位标记(watermark)的概念来描述这个压力情况。Linux内存的使用设置了三种内存水位标记,high、low、min。...swappiness设置为100代表系统会尽量少用剩余内存而多使用swap么?不是的,这个值设置为100表示内存发生回收时,从cache回收内存和swap交换的优先级一样。

4.7K52

图解 | Linux内存回收之LRU算法

内存回收工作主要包括以下几个步骤: 内核为了加速某些操作(如文件 I/O),会对操作的结果进行缓存(如文件页缓存),而缓存使用的内存是可以被回收的。所以,当可用内存不足时,首先会回收内核中的缓存。...由于回收内存的方式有三种,所以本文重点以 swap 机制作为分析对象,来介绍当内存不足时,内核是怎么进行内存回收工作的。...标志位设置为 0。...PG_referenced 标志位设置为 0。...LRU算法状态流转 我们最后以一张状态流转图来描述 LRU 算法的过程: 三、总结 本文主要介绍了 Linux 内核内存回收过程中使用的 LRU 算法的原理,在下一篇文章中,我们将会介绍 Linux

3.4K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    聊聊Linux内核的内存回收上篇

    概述 内存回收是把已经使用过的的物理页帧重新放回到内核中的buddy系统(buddy系统用于申请空闲物理页帧的子系统)管理中,解决内存紧张的问题;内存回收的页帧包括未修改的文件页帧、修改且完成同步的文件页帧...内核对所有用户态进程消耗的RAW内存总量不做严格的约束,当系统负载相对较低的时候,内存大部分被磁盘高速缓存使用,随着系统负载增大,系统进程使用的内存越来越多,磁盘的高速缓存占用的内存就会被缩小,内存页帧的回收必须在消耗所有空闲页帧之前进行...slab分配器在频繁申请和释放的情况下效率比较高 基于LRU页帧链表 内存页帧是有映射的,映射到一个或者多个进程的虚拟空间。内核一般用内存页帧的引用次数来表示页帧的活跃程度。...页帧回收会按照几个原则来进行内存页帧的回收,第一是回收高速磁盘缓存的页帧;第二回收睡眠时间较长的进程中的页帧;第三是回收共享页帧的引用全部清除;第四回收LRU链表中未使用的 页帧回收的过程页分为直接回收和定期回收...直接回收是发生在分配页帧时候发现空闲页帧不足的情况下。直接回收和定期回收底层都是走相同的逻辑,但是直接回收是实在紧急情况下进行,必须做到回收到足够的页帧。

    1.8K30

    内存回收

    前言: 前文《内存映射技术分析》描述了虚拟内存的管理、内存映射;《物理内存管理》介绍了物理内存管理。 本篇介绍一下内存回收内存回收应该是整个Linux内存管理上最难理解的部分了。...分析: 1,PFRA Page Frame Reclaim Algorithm,Linux内存回收算法。 不过,PFRA和常规的算法不同。...2,watermark 如前文《物理内存管理》提到,每个memory zone都有watermark,如果低于了watermark,Linux就考虑回收内存了。...只是说,如果内存不够了,linux会尝试回收,尽量满足。 回收的时候,如果实在回收不到了,linux会选择最差的策略---杀掉一部分进程。...后记: 虚拟内存的管理,内存映射,物理内存管理,内存回收,差不多就是Linux内存管理的主要功能了。 Good Luck~

    3.4K100

    Linux设置虚拟内存

    在我们自己的购买的服务器环境中,一般是买的1g的内存,但是当服务器里面的东西装的比较多的时候就会导致内存不够用了,这个时候可以通过增加虚拟内存来夸大内存容量。...Linux设置虚拟内存 交换技术 交换(Swapping)技术它的主要特点是:打破了一个程序一旦进入内存,就一直驻留在内存直到运行结束的限制。...[root@localhost swap]# du -sh /usr/swap/swapfile 4.1G /usr/swap/swapfile [root@localhost swap]# 将目标设置为...swap分区文件 使用命令mkswap /usr/swap/swapfile将swapfile文件设置为swap分区文件 [root@localhost swap]# mkswap /usr/swap/...buffers/cache: 326 654 Swap: 4095 0 4095 [root@localhost swap]# 设置开机自动启用虚拟内存

    12.9K82

    Redis内存回收

    1.Redis内存回收Redis之所以性能强,最主要的原因就是基于内存存储。然而单节点的Redis其内存大小不宜过大,会影响持久化或主从同步性能。...因此,Redis内部会有两套内存回收的策略: 内存过期策略 内存淘汰策略 1.1.内存过期处理存入Redis中的数据可以配置过期时间,到期后再次访问会发现这些数据都不存在了,也就是被过期清理了。...Redis并不会在KEY过期时立刻删除KEY,因为要实现这样的效果就必须给每一个过期的KEY设置时钟,并监控这些KEY的过期状态。无论对CPU还是内存都会带来极大的负担。...因此Redis允许设置内存告警阈值,当内存使用达到阈值时就会主动挑选部分KEY删除以释放更多内存。这叫做内存淘汰机制。...而如果设置了其它策略,则会在每次执行命令后判断占用内存是否达到阈值。如果达到阈值则会基于配置的淘汰策略尝试进行内存淘汰,直到占用内存小于阈值为止。关于 LRU 和 LFULRU是最近最久未使用。

    10910

    Redis内存回收策略

    Redis会因为内存不足而产生错误,也会因为回收过久而导致系统长期的停顿,因此了解掌握Redis的回收策略十分重要。...当Redis的内存达到规定的最大值时,可以进行配置进行淘汰键值,并且将一些键值对进行回收。 我们打开Redis安装目录下的redis.conf文件。...noeviction:不淘汰任何键值对,当内存满时,如果进行读操作,例如get命令,它将正常工作,而做写操作,它将返回错误,也就是说,当Redis采用这个策略内存达到最大的时候,它就只能读不能写了。...当设置maxmemory-samples越大,则Redis删除的就越精确,但消耗CPU。 回收超时策略的缺点是必须指明超时的键值对,这会给程序开发带来一些设置超时的代码,增加刘开发者的工作量。...对所有的键值对进行回收,有可能把正在使用的键值对删掉,增加了存储的不稳定性。对于垃圾回收的策略,还需要控制回收的时间。

    2.5K20

    Linux 内存中的Cache,真的能被回收么?

    您真的了解Linux的free命令么? 在Linux系统中,我们经常用free命令来查看系统内存的使用状态。...在Linux内存管理中,这里的buffer指Linux内存的:Buffer cache。这里的cache指Linux内存中的:Page cache。翻译成中文可以叫做缓冲区缓存和页面缓存。...如何回收cache? Linux内核会在内存将要耗尽的时候,触发内存回收的工作,以便释放出内存给急需内存的进程使用。 一般情况下,这个操作中主要的内存释放都来自于对buffer/cache的释放。...在系统中除了内存将被耗尽的时候可以清缓存以外,我们还可以使用下面这个文件来人工触发缓存清除的操作: 方法是: 当然,这个文件可以设置的值分别为1、2、3。...我们可以人工触发内存回收看看现在到底能回收多少内存: 可以看到,cached占用的空间并没有像我们想象的那样完全被释放,其中13G的空间仍然被/tmp/tmpfs中的文件占用的。

    2.9K110

    Linux 内存中的 Cache 真的能被回收么?

    Linux 系统中,我们经常用 free 命令来查看系统内存的使用状态。...在 Linux内存管理中,这里的buffer 指 Linux 内存的:Buffer cache。这里的 cache 指 Linux 内存中的:Page cache。...如何回收 cache? Linux 内核会在内存将要耗尽的时候,触发内存回收的工作,以便释放出内存给急需内存的进程使用。...在系统中除了内存将被耗尽的时候可以清缓存以外,我们还可以使用下面这个文件来人工触发缓存清除的操作: 方法是: 当然,这个文件可以设置的值分别为1、2、3。...我们可以人工触发内存回收看看现在到底能回收多少内存: 可以看到,cached 占用的空间并没有像我们想象的那样完全被释放,其中 13G 的空间仍然被 /tmp/tmpfs 中的文件占用的。

    5.3K50

    Redis-内存回收

    1 内存回收   Reids 所有的数据都是存储在内存中的,在某些情况下需要对占用的内存空间进行回收。...内存回收主要分为两类,一类是 key 过期,一类是内存使用达到上限(max_memory) 触发内存淘汰。 1.1 过期策略   要实现 key 过期,我们有几种思路。...1.2.1 最大内存设置   redis.conf 参数配置: # maxmemory   如果不设置 maxmemory 或者设置为 0,64 位系统不限制内存,32 位系统最多使用...(3)volatile-random:从已设置过期时间的数据集中任意选择数据淘汰。 (4)volatile-lfu:从已设置过期时间的数据集挑选使用频率最低的数据淘汰。...如果没有符合前提条件的 key 被淘汰,那么 volatile-lru、volatile-random 、volatile-ttl 相当于 noeviction(不做内存回收)。

    1.3K50

    php内存泄漏,内存溢出,垃圾回收

    在 php-fpm 配置文件中,将pm.max_requests这个参数设置小一点。这个参数的含义是:一个 php-fpm 子进程最多处理pm.max_requests个用户请求后,就会被销毁。...当一个 php-fpm 进程被销毁后,它所占用的所有内存都会被回收。 垃圾回收 一、概念 垃圾回收机制是一种动态存储分配的方案。它会自动释放程序不再需要的已分配的内存块。...垃圾回收机制可以让程序员不必过分关心程序内存分配,从而将更多的精力投入到业务逻辑。...但是当两个或多个对象互相引用形成环状后,内存对象的计数器则不会消减为0;这时候,这一组内存对象已经没用了,但是不能回收,从而导致内存泄露的现象。...php5.3开始,使用了新的垃圾回收机制,在引用计数基础上,实现了一种复杂的算法,来检测内存对象中引用环的存在,以避免内存泄露。

    3.3K20

    内存分配与回收策略

    内存分配与回收策略对象的内存分配,就是在堆上分配(也可能经过 JIT 编译后被拆散为标量类型并间接在栈上分配),对象主要分配在新生代的 Eden 区上,少数情况下可能直接分配在老年代,**分配规则不固定...,所以 Minor GC 非常频繁,一般回收速度也比较快。...虚拟机提供了一个 -XX:PretenureSizeThreshold 参数,令大于这个设置值的对象直接在老年代分配,这样做的目的是避免在 Eden 区及两个 Survivor 区之间发生大量的内存复制...(还记得吗,新生代采用复制算法回收垃圾)长期存活的对象将进入老年代JVM 给每个对象定义了一个对象年龄计数器。...使用 -XXMaxTenuringThreshold 设置新生代的最大年龄,只要超过该参数的新生代对象都会被转移到老年代中去。

    13010

    weakSet与js内存回收

    $ node --expose-gc index.js // 第一次垃圾回收,当前内存使用情况:1.76MB // 第二次垃圾回收,当前内存使用情况:18.54MB // 第三次垃圾回收,当前内存使用情况...:1.77MB // 第二次垃圾回收,当前内存使用情况:18.54MB // 第三次垃圾回收,当前内存使用情况:18.54MB 比较1、2例子可以发现,当引用类型key的值指向为空的时候,使用WeakMap...toFixed(2)}MB`); }, 100) // 结果 // 第一次垃圾回收,当前内存使用情况:1.77MB // 第二次垃圾回收,当前内存使用情况:18.54MB // 第三次垃圾回收,当前内存使用情况...:18.54MB // 第N次垃圾回收,当前内存使用情况:18.55MB // ... // 第N次垃圾回收,当前内存使用情况:2.00MB // 第N次垃圾回收,当前内存使用情况:2.01MB ---...,当前内存使用情况:1.76MB // 第二次垃圾回收,当前内存使用情况:18.54MB, // 当前Map的长度: 1 // 第三次垃圾回收,当前内存使用情况:18.54MB, // 当前Map

    1.4K20

    内存分配与回收策略

    内存分配与回收策略 对象优先在 Eden 分配 大多数情况下,对象在新生代 Eden 区中分配。当 Eden 区没有足够空间进行分配时,虚拟机将发起一次 Minor GC。...Minor GC:指发生在新生代的垃圾收集动作,因为 Java 对象大多都具备朝生夕灭的特性,所以 Minor GC 非常频繁,一般回收速度也比较快。...大对象直接进入老年代 大对象是指需要大量连续内存空间的 Java 对象,如很长的字符串或数据。...虚拟机提供了一个 -XX:PretenureSizeThreshold 参数,令大于这个设置值的对象直接在老年代分配,这样做的目的是避免在 Eden 区及两个 Survivor 区之间发生大量的内存复制...使用 -XXMaxTenuringThreshold 设置新生代的最大年龄,只要超过该参数的新生代对象都会被转移到老年代中去。

    76330

    JVM内存分配与回收

    它可以将内存分为大小相同的两块,每次使用其中的一块。当这一块的内存使用完后,就将还存活的对象复制到另一块去,然后再把使用的空间一次清理掉。这样就使每次的内存回收都是对内存区间的一半进行回收。...4.垃圾收集器 如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。 虽然我们对各个收集器进行比较,但并非为了挑选出一个最好的收集器。...以上的堆被存活对象占用 对象分配和晋升的速度变化非常大 垃圾回收时间特别长,超过1秒  G1调优目标  6GB以上内存 停顿时间是500ms以内 吞吐量是90%以上 GC常用参数 堆栈设置   ...设置G1收集器   -XX:ParallelGCThreads:设置用于垃圾回收的线程数 并行收集器设置   -XX:ParallelGCThreads:设置并行收集器收集时使用的CPU数。...-XX:MaxGCPauseMillis:设置并行收集最大暂停时间   -XX:GCTimeRatio:设置垃圾回收时间占程序运行时间的百分比。

    1.6K20

    Go 内存管理 -- 垃圾回收

    本篇要说的就是垃圾回收,常见的垃圾回收算法有标记-清除、标记整理、复制,然后在这些算法基础上有分为分代&非分代回收,这些算法都非常优秀,只是面对的场景不同罢了,但是要是想透彻的理解垃圾回收,看Java中的实现再合适不过了...,如果能对于Java中的垃圾回收非常熟悉,理解go的垃圾回收将非常简单。...image.png 很显然如果使用标记清除算法: 1、确定标记的起点GCRoot 2、存在一定的内存碎片 3、效率相对于复制、整理 效率要稍微高一些 但标记清除是最常见的垃圾回收算法,Java...强制回收 因为系统启动或者短时间内大量分配对象这些原因,会将垃圾回收的gc_trigger(垃圾回收的触发器)的标准瞬间推高。当服务正常后,活跃对象远小于这个阈值,造成垃圾回收无法触发。...关于整体回收这一块儿内容,大家有兴趣可以看一下源码。 关于go的垃圾回收暂时就先介绍这么多。 关于go的内存管理后续会单独出一个系列,所以本系列仅仅阐述了一个内存管理的梗概和基础概念。

    98041

    JVM垃圾回收器、内存分配与回收策略

    的设计原则就是简单可行的性能调优,只需声明以下参数即可: -XX:+UseG1GC -Xmx16g -XX:MaxGCPauseMills=300 其中,-XX:+UseG1GC表明开启G1收集器,-Xmx16g设置内存为...:对各个Region的回收价值和成本进行排序,根据用户所期望的GC停顿时间来制定回收计划 内存分配与回收策略 对象的内存分配主要是指在Java堆上的分配,通常会优先分配在新生代,然后经历一系列GC后仍然存活的对象会进入到老年代...-Xms:设置初始化堆内存,-Xmx设置最大堆内存设置为相等可防止内存抖动(剩余内存大于70%、小于40%时,自动触发内存扩大或缩小) 1....,一般设置为整个堆内存的3/1或者1/4 -XX:NewRatio设置新生代与老年代的堆内存比例 -XX:SurvivorRatio设置eden区和survivor区之间的比例 2....如果小于,则根据HandlePromotionFailure的设置是否允许担保分配内存失败:如果允许失败,则只进行minor GC;反之,则进行full GC。

    66410
    领券