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

Linux内存回收和交换

Linux内存管理是一套非常复杂系统,而swap只是其中一个很小处理逻辑。希望本文能让读者了解Linux对swap使用大概是什么样子。...这两个方法中实际进行内存回收过程殊途同归,最终都是调用shrink_zone()方法进行针对每个zone内存页缩减。...这个方法中会再调用shrink_lruvec()这个方法对每个组织页链表进程检查。找到这个线索之后,我们就可以清晰看到内存回收操作究竟针对page有哪些了。...分析代码会发现,Linux内核对这部分逻辑实现代码在get_scan_count()这个方法中,这个方法被shrink_lruvec()调用。...那么如何描述内存使用压力呢?Linux内核使用水位标记(watermark)概念来描述这个压力情况。Linux内存使用设置了三种内存水位标记,high、low、min。

4.7K52

聊聊Linux内核内存回收上篇

概述 内存回收是把已经使用过物理页帧重新放回到内核中buddy系统(buddy系统用于申请空闲物理页帧子系统)管理中,解决内存紧张问题;内存回收页帧包括未修改文件页帧、修改且完成同步文件页帧...内核对所有用户态进程消耗RAW内存总量不做严格约束,当系统负载相对较低时候,内存大部分被磁盘高速缓存使用,随着系统负载增大,系统进程使用内存越来越多,磁盘高速缓存占用内存就会被缩小,内存页帧回收必须在消耗所有空闲页帧之前进行...内核一般用内存页帧引用次数来表示页帧活跃程度。一个内存区zone将空闲页帧和已经在使用页帧分别用buddy系统和 zoneLRU链表管理。...LRU_UNEVICTABLE, NR_LRU_LISTS }; 页帧回收 页帧回收会按照几个原则来进行内存页帧回收,第一是回收高速磁盘缓存页帧;第二回收睡眠时间较长进程中页帧;第三是回收共享页帧引用全部清除...;第四回收LRU链表中未使用 页帧回收过程页分为直接回收和定期回收

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

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

    如下图所示: 但内存资源是有限,随着系统中运行进程越来越多,系统中可用内存就会越来越少。那么,当可用内存不足时,Linux 内核是怎么处理呢?...内存回收工作主要包括以下几个步骤: 内核为了加速某些操作(如文件 I/O),会对操作结果进行缓存(如文件页缓存),而缓存使用内存是可以被回收。所以,当可用内存不足时,首先会回收内核中缓存。...由于回收内存方式有三种,所以本文重点以 swap 机制作为分析对象,来介绍当内存不足时,内核是怎么进行内存回收工作。...LRU算法状态流转 我们最后以一张状态流转图来描述 LRU 算法过程: 三、总结 本文主要介绍了 Linux 内核内存回收过程中使用 LRU 算法原理,在下一篇文章中,我们将会介绍 Linux...内核是如何实现内存回收,有兴趣敬请期待。

    3.4K20

    内存回收

    前言: 前文《内存映射技术分析》描述了虚拟内存管理、内存映射;《物理内存管理》介绍了物理内存管理。 本篇介绍一下内存回收内存回收应该是整个Linux内存管理上最难理解部分了。...分析: 1,PFRA Page Frame Reclaim Algorithm,Linux内存回收算法。 不过,PFRA和常规算法不同。...Linux通过avc遍历所有的映射了当前pageVMA,做反向映射。 9,kswapd 内核线程,负责内存回收。zonewatermark不满足时候,就需要唤醒kswapd来回收内存。...只是说,如果内存不够了,linux会尝试回收,尽量满足。 回收时候,如果实在回收不到了,linux会选择最差策略---杀掉一部分进程。...后记: 虚拟内存管理,内存映射,物理内存管理,内存回收,差不多就是Linux内存管理主要功能了。 Good Luck~

    3.4K100

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

    Linux内核会在内存将要耗尽时候,触发内存回收工作,以便释放出内存给急需内存进程使用。 一般情况下,这个操作中主要内存释放都来自于对buffer/cache释放。...在系统中除了内存将被耗尽时候可以清缓存以外,我们还可以使用下面这个文件来人工触发缓存清除操作: 方法是: 当然,这个文件可以设置值分别为1、2、3。...我们可以人工触发内存回收看看现在到底能回收多少内存: 可以看到,cached占用空间并没有像我们想象那样完全被释放,其中13G空间仍然被/tmp/tmpfs中文件占用。...说到共享内存Linux还给我们提供了另外一种共享内存方法,就是: mmap mmap()是一个非常重要系统调用,这仅从mmap本身功能描述上是看不出来。...使用mmap方法申请MAP_SHARED标志内存会占用cache空间,除非进程将这段内存munmap,否则相关cache空间都不会被自动释放。

    2.9K110

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

    Linux 内核会在内存将要耗尽时候,触发内存回收工作,以便释放出内存给急需内存进程使用。一般情况下,这个操作中主要内存释放都来自于对 buffer/cache 释放。...在系统中除了内存将被耗尽时候可以清缓存以外,我们还可以使用下面这个文件来人工触发缓存清除操作: 方法是: 当然,这个文件可以设置值分别为1、2、3。...我们可以人工触发内存回收看看现在到底能回收多少内存: 可以看到,cached 占用空间并没有像我们想象那样完全被释放,其中 13G 空间仍然被 /tmp/tmpfs 中文件占用。...说到共享内存Linux 还给我们提供了另外一种共享内存方法,就是: mmap mmap() 是一个非常重要系统调用,这仅从 mmap 本身功能描述上是看不出来。...4、使用 mmap 方法申请 MAP_SHARED 标志内存会占用 cache 空间,除非进程将这段内存 munmap,否则相关 cache 空间都不会被自动释放。

    5.3K50

    垃圾收集策略静态内存分配和回收动态内存分配和回收1 Java堆内存回收2 回收无效对象过程3 方法内存回收4 垃圾收集算法5 Java中引用种类

    静态内存分配和回收 静态内存分配是指在程序开始运行时由编译器分配内存,在被编译时就已经能够确定需要空间,当程序被加载时系统把内存一次性分配给它,这些内存不会在程序执行时发生变化,直到程序执行结束时才回收内存...包括原生数据类型及对象引用 这些静态内存空间在栈上分配,方法运行结束,对应栈帧撤销,内存空间被回收....动态内存分配和回收 在程序执行时才知道要分配存储空间大小,对象何时被回收也是不确定,只有等到该对象不再使用才会被回收....堆和方法内存回收具有不确定性,因此垃圾收集器在回收堆和方法内存时候花了一点心思. 1 Java堆内存回收 1.1 判定回收对象 在对堆进行对象回收之前,首先要判断哪些是无效对象即一个对象不被任何对象或变量引用...yes,I am still alive :) no,I am dead :( 3 方法内存回收 如果使用复制算法实现堆内存回收,堆就会被分为新生代和老年代 新生代中对象"朝生夕死",每次垃圾回收都会清除掉大量对象

    1.1K101

    Redis内存回收

    1.Redis内存回收Redis之所以性能强,最主要原因就是基于内存存储。然而单节点Redis其内存大小不宜过大,会影响持久化或主从同步性能。...因此,Redis内部会有两套内存回收策略: 内存过期策略 内存淘汰策略 1.1.内存过期处理存入Redis中数据可以配置过期时间,到期后再次访问会发现这些数据都不存在了,也就是被过期清理了。...server.lua_timedout) { // 调用performEvictions()方法尝试进行内存淘汰 int out_of_memory = (performEvictions...这取决于配置内存淘汰策略,Redis支持很多种内存淘汰策略,例如LRU、LFU、Random. 但默认策略是直接拒绝新写入请求。...每次需要内存淘汰时,就会抽样一部分KEY,找出其中空闲时间最长,也就是now - lru结果最大,然后将其删除。如果内存依然不足,就重复这个过程。

    10910

    python内存回收问题

    python实际上,对于占用很大内存对象,并不会马上释放。 举例,a=range(10000*10000),会发现内存飙升一个多G,del a 或者a=[]都不能将内存降下来。。...del 可以删除多个变量,del a,b,c,d 办法: import gc (garbage collector) del a gc.collect() 马上内存就释放了。...在IPython中用run运行程序时,都是在独立运行环境中运行,结束之后才将程序运行环境中结果复制到IPython环境中,因此不会有变量被重复调用问题。...如果你是指在自己程序中想删除所有全局变量的话,可以自己编写一个clear函数,通过globals()获取全局变量然后将其中不需要内容删除,例如下面的程序保留函数,类,模块,删除所有其它全局变量:...__name__ == "module":             continue         del globals()[key] 不过程序中应该避免这种对全局变量依赖。

    1.2K10

    Redis内存回收策略

    Redis会因为内存不足而产生错误,也会因为回收过久而导致系统长期停顿,因此了解掌握Redis回收策略十分重要。...当Redis内存达到规定最大值时,可以进行配置进行淘汰键值,并且将一些键值对进行回收。 我们打开Redis安装目录下redis.conf文件。...,Redis将回收那些超时(仅仅是超时)键值对,也就是它只淘汰那些超时键值对。...noeviction:不淘汰任何键值对,当内存满时,如果进行读操作,例如get命令,它将正常工作,而做写操作,它将返回错误,也就是说,当Redis采用这个策略内存达到最大时候,它就只能读不能写了。...对所有的键值对进行回收,有可能把正在使用键值对删掉,增加了存储不稳定性。对于垃圾回收策略,还需要控制回收时间。

    2.5K20

    Android内存分配与回收

    1、JVM内存回收机制 1.1 回收算法 标记回收算法(Mark and Sweep GC)         从"GC Roots"集合开始,将内存整个遍历一次,保留所有可以被GC Roots直接或间接引用到对象...,而剩下对象都当作垃圾对待并回收,这个算法需要中断进程内其它组件执行并且可能产生内存碎片 复制算法 (Copying)          将现有的内存空间分为两快,每次只使用其中一块,在垃圾回收时将正在使用内存存活对象复制到未被使用内存块中...,之后,清除正在使用内存块中所有对象,交换两个内存角色,完成垃圾回收。...这种方法既避免了碎片产生,又不需要两块相同内存空间,因此,其性价比比较高。...1.2 复制和标记-压缩算法区别        乍一看这两个算法似乎并没有多大区别,都是标记了然后挪到另外内存地址进行回收,那为什么不同分代要使用不同回收算法呢?

    1.4K80

    Java内存回收机制

    在Java中,它内存管理包括两方面:内存分配(创建Java对象时候)和内存回收,这两方面工作都是由JVM自动完成,降低了Java程序员学习难度,避免了像C/C++直接操作内存危险。...在这个状态下,系统垃圾回收机制准备回收该对象所占用内存,在回收之前,系统会调用finalize()方法进行资源清理,如果资源整理后重新让一个以上引用变量引用该对象,则这个对象会再次变为可达状态;否则就会进入不可达状态...3)不可达状态:当对象所有关联都被切断,且系统调用finalize()方法进行资源清理后依旧没有使该对象变为可达状态,则这个对象将永久性失去引用并且变成不可达状态,系统才会真正回收该对象所占用资源...3.2堆内存分代回收 1)分代回收依据: ①对象生存时间长短:大部分对象在Young期间就被回收 ②不同代采取不同垃圾回收策略:新(生存时间短)老(生存时间长)对象之间很少存在引用 2) 堆内存分代...③Permanent代 : Ⅰ用      途 :用来装载Class,方法等信息,默认为64M,不会被回收 Ⅱ对象来源 :eg:对于像Hibernate,Spring这类喜欢AOP动态生成类框架,往往会生成大量动态代理类

    1.8K70

    Redis-内存回收

    1 内存回收   Reids 所有的数据都是存储在内存,在某些情况下需要对占用内存空间进行回收。...内存回收主要分为两类,一类是 key 过期,一类是内存使用达到上限(max_memory) 触发内存淘汰。 1.1 过期策略   要实现 key 过期,我们有几种思路。...该策略可以立即清除过期数据,对内存很友好;但是会占用大量 CPU 资源去处理过期 数据,从而影响缓存响应时间和吞吐量。...问题:如果都不过期,Redis 内存满了怎么办? 1.2 淘汰策略   Redis 内存淘汰策略,是指当内存使用达到最大内存极限时,需要使用淘汰算法来决定清理掉哪些数据,以保证新数据存入。...如果没有符合前提条件 key 被淘汰,那么 volatile-lru、volatile-random 、volatile-ttl 相当于 noeviction(不做内存回收)。

    1.3K50

    Linux手动清除内存命令方法

    Linux手动清除缓存方法 Linux长时间使用会导致cache缓存占用过大,甚至拖累CPU使用率,可以通过命令手动释放Linux内存,详细教程如下: 一:先查看下当前Linux内存占用情况 命令...: total:是指计算机总物理内存; used:已用内存; free:空余内存; total = used + free shared:被多个进程共享内存; buff/cache:buffers...一般我们清理Linux缓存主要是清理buff/cache占用内存资源。...三:执行清除Linux缓存命令 命令:echo 3 > /proc/sys/vm/drop_caches /proc是一个虚拟文件系统,通过对它读写操作做为与kernel实体间进行通信一种手段。...通过修改/proc中文件来对当前kernel行为做出调整。所以,我们通过调整/proc/sys/vm/drop_caches来释放内存。 综上,3条命令即可清除Linux缓存释放内存

    8.5K30

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

    垃圾回收 一、概念 垃圾回收机制是一种动态存储分配方案。它会自动释放程序不再需要已分配内存块。垃圾回收机制可以让程序员不必过分关心程序内存分配,从而将更多精力投入到业务逻辑。...二、针对php垃圾回收机制 1、在PHP5.3版本之前,使用垃圾回收机制是单纯“引用计数”。...但是当两个或多个对象互相引用形成环状后,内存对象计数器则不会消减为0;这时候,这一组内存对象已经没用了,但是不能回收,从而导致内存泄露现象。...php5.3开始,使用了新垃圾回收机制,在引用计数基础上,实现了一种复杂算法,来检测内存对象中引用环存在,以避免内存泄露。...2、随着PHP发展,PHP开发者增加以及其所承载业务范围扩大,在PHP5.3中引入了更加完善垃圾回收机制,新垃圾回收机制解决了无法处理循环引用内存泄漏问题。 ?

    3.3K20

    JavaScript 内存泄露和垃圾回收

    而java、c#、js等是为了解放程序员负担,提出了程序自动释放内存,这种方式就是垃圾回收机制。...复制代码 什么时候触发 垃圾回收 ie 垃圾回收器周期性运行,如果分配内存非常多,那么回收工作也会很艰巨,确定垃圾回收时间间隔就变成了一个值得思考问题。...IE6垃圾回收是根据内存分配量运行,当环境中存在256个变量、4096个对象、64k字符串任意一种情况时候就会触发垃圾回收器工作,看起来很科学,不用按一段时间就调用一次,有时候会没必要,这样按需调用不是很好吗...微软在IE7中做了调整,触发条件不再是固定,而是动态修改,初始值和IE6相同,如果垃圾回收回收内存分配量低于程序占用内存15%,说明大部分内存不可被回收,设垃圾回收触发条件过于敏感,这时候把临街条件翻倍...,如果回收内存高于85%,说明大部分内存早就该清理了,这时候把触发条件置回。

    32640

    直接内存回收等待队列

    在直接内存回收过程中,有可能会造成当前需要分配内存进程被加入一个等待队列,当整个node空闲页数量满足要求时,由kswapd唤醒它重新获取内存。...而在kswapd中会对node中每一个不平衡zone进行内存回收,直到所有zone都满足 zone分配页框后剩余页框数量 > 此zonehigh阀值 + 此zone保留页框数量。...kswapd就会停止内存回收,然后唤醒在等待队列进程。...和ZONE_NORMAL平均min阀值数量,大于则说明node平衡 * 加入pgdat->pfmemalloc_wait情况 * 1.如果分配标志禁止了文件系统操作,则将要进行内存回收进程设置为...在此nodekswapd进行内存回收后,会通过再次判断此node是否平衡来唤醒这些进程,如果node平衡,则唤醒这些进程,否则不唤醒。

    1.6K40

    内存分配与回收策略

    内存分配与回收策略对象内存分配,就是在堆上分配(也可能经过 JIT 编译后被拆散为标量类型并间接在栈上分配),对象主要分配在新生代 Eden 区上,少数情况下可能直接分配在老年代,**分配规则不固定...大对象直接进入老年代大对象是指需要大量连续内存空间 Java 对象,如很长字符串或数据。...(还记得吗,新生代采用复制算法回收垃圾)长期存活对象将进入老年代JVM 给每个对象定义了一个对象年龄计数器。...**System.gc() 方法调用** 此方法调用是建议 JVM 进行 Full GC,注意这**只是建议而非一定**,但在很多情况下它会触发 Full GC,从而增加 Full GC 频率...,在 HotSpot 虚拟机中也称为永久代(Permanet Generation),存放一些类信息、常量、静态变量等数据,当系统要加载类、反射类和调用方法较多时,永久代可能会被占满,会触发 Full

    13010

    weakSet与js内存回收

    :1.77MB // 第二次垃圾回收,当前内存使用情况:18.54MB // 第三次垃圾回收,当前内存使用情况:18.54MB 比较1、2例子可以发现,当引用类型key值指向为空时候,使用WeakMap...时候会立即释放内存 当使用Map时候不会立即释放内存。...- 虽然,javascript引擎会自动优化内存,但是作为开发者还是应该适当关注一下内存使用情况,以防止极端情况内存释放不及时。...第一次垃圾回收,当前内存使用情况:1.76MB // 第二次垃圾回收,当前内存使用情况:18.54MB, // 当前Map长度: 1 // 第三次垃圾回收,当前内存使用情况:18.54MB, /.../ 当前Map长度: 1 // 第四次垃圾回收,当前内存使用情况:1.94MB, // 当前Map长度: 0 附录 使用 node 命令执行js时候加入 –expose-gc参数作用 -

    1.4K20
    领券