1. 程式人生 > >Linux記憶體中的Cache真的能被回收麼?

Linux記憶體中的Cache真的能被回收麼?

在Linux系統中,我們經常用free命令來檢視系統記憶體的使用狀態。在一個RHEL6的系統上,free命令的顯示內容大概是這樣一個狀態:

[[email protected] ~]# free
             total       used       free     shared    buffers     cached
Mem:     132256952   72571772   59685180          0    1762632   53034704
-/+ buffers/cache:   17774436  114482516
Swap:      2101192        508    2100684

這裡的預設顯示單位是kb,我的伺服器是128G記憶體,所以數字顯得比較大。這個命令幾乎是每一個使用過Linux的人必會的命令,但越是這樣的命令,似乎真正明白的人越少(我是說比例越少)。一般情況下,對此命令輸出的理解可以分這幾個層次:

  1. 不瞭解。這樣的人的第一反應是:天啊,記憶體用了好多,70個多G,可是我幾乎沒有執行什麼大程式啊?為什麼會這樣?Linux好佔記憶體!
  2. 自以為很瞭解。這樣的人一般自習評估過會說:嗯,根據我專業的眼光看出來,記憶體才用了17G左右,還有很多剩餘記憶體可用。buffers/cache佔用的較多,說明系統中有程序曾經讀寫過檔案,但是不要緊,這部分記憶體是當空閒來用的。
  3. 真的很瞭解。這種人的反應反而讓人感覺最不懂Linux,他們的反應是:free顯示的是這樣,好吧我知道了。神馬?你問我這些記憶體夠不夠,我當然不知道啦!我特麼怎麼知道你程式怎麼寫的?

根據目前網路上技術文件的內容,我相信絕大多數了解一點Linux的人應該處在第二種層次。大家普遍認為,buffers和cached所佔用的記憶體空間是可以在記憶體壓力較大的時候被釋放當做空閒空間用的。但真的是這樣麼?在論證這個題目之前,我們先簡要介紹一下buffers和cached是什麼意思:

什麼是buffer/cache?

buffer和cache是兩個在計算機技術中被用濫的名詞,放在不通語境下會有不同的意義。在Linux的記憶體管理中,這裡的buffer指Linux記憶體的:Buffer cache。這裡的cache指Linux記憶體中的:Page cache。翻譯成中文可以叫做緩衝區快取和頁面快取。在歷史上,它們一個(buffer)被用來當成對io裝置寫的快取,而另一個(cache)被用來當作對io裝置的讀快取,這裡的io裝置,主要指的是塊裝置檔案和檔案系統上的普通檔案。但是現在,它們的意義已經不一樣了。

在當前的核心中,page cache顧名思義就是針對記憶體頁的快取,說白了就是,如果有記憶體是以page進行分配管理的,都可以使用page cache作為其快取來管理使用。當然,不是所有的記憶體都是以頁(page)進行管理的,也有很多是針對塊(block)進行管理的,這部分記憶體使用如果要用到cache功能,則都集中到buffer cache中來使用。(從這個角度出發,是不是buffer cache改名叫做block cache更好?)然而,也不是所有塊(block)都有固定長度,系統上塊的長度主要是根據所使用的塊裝置決定的,而頁長度在X86上無論是32位還是64位都是4k。

明白了這兩套快取系統的區別,就可以理解它們究竟都可以用來做什麼了。

什麼是page cache

Page cache主要用來作為檔案系統上的檔案資料的快取來用,尤其是針對當程序對檔案有read/write操作的時候。如果你仔細想想的話,作為可以對映檔案到記憶體的系統呼叫:mmap是不是很自然的也應該用到page cache?在當前的系統實現裡,page cache也被作為其它檔案型別的快取裝置來用,所以事實上page cache也負責了大部分的塊裝置檔案的快取工作。

什麼是buffer cache

Buffer cache則主要是設計用來在系統對塊裝置進行讀寫的時候,對塊進行資料快取的系統來使用。這意味著某些對塊的操作會使用buffer cache進行快取,比如我們在格式化檔案系統的時候。一般情況下兩個快取系統是一起配合使用的,比如當我們對一個檔案進行寫操作的時候,page cache的內容會被改變,而buffer cache則可以用來將page標記為不同的緩衝區,並記錄是哪一個緩衝區被修改了。這樣,核心在後續執行髒資料的回寫(writeback)時,就不用將整個page寫回,而只需要寫回修改的部分即可。

如何回收cache?

Linux核心會在記憶體將要耗盡的時候,觸發記憶體回收的工作,以便釋放出記憶體給急需記憶體的程序使用。一般情況下,這個操作中主要的記憶體釋放都來自於對buffer/cache的釋放。尤其是被使用更多的cache空間。既然它主要用來做快取,只是在記憶體夠用的時候加快程序對檔案的讀寫速度,那麼在記憶體壓力較大的情況下,當然有必要清空釋放cache,作為free空間分給相關程序使用。所以一般情況下,我們認為buffer/cache空間可以被釋放,這個理解是正確的。

但是這種清快取的工作也並不是沒有成本。理解cache是幹什麼的就可以明白清快取必須保證cache中的資料跟對應檔案中的資料一致,才能對cache進行釋放。所以伴隨著cache清除的行為的,一般都是系統IO飆高。因為核心要對比cache中的資料和對應硬碟檔案上的資料是否一致,如果不一致需要寫回,之後才能回收。

在系統中除了記憶體將被耗盡的時候可以清快取以外,我們還可以使用下面這個檔案來人工觸發快取清除的操作:

[[email protected] ~]# cat /proc/sys/vm/drop_caches 
1

方法是:

echo 1 > /proc/sys/vm/drop_caches

當然,這個檔案可以設定的值分別為1、2、3。它們所表示的含義為:
echo 1 > /proc/sys/vm/drop_caches:表示清除pagecache。

echo 2 > /proc/sys/vm/drop_caches:表示清除回收slab分配器中的物件(包括目錄項快取和inode快取)。slab分配器是核心中管理記憶體的一種機制,其中很多快取資料實現都是用的pagecache。

echo 1 > /proc/sys/vm/drop_caches:表示清除pagecache和slab分配器中的快取物件。

cache都能被回收麼?

我們分析了cache能被回收的情況,那麼有沒有不能被回收的cache呢?當然有。我們先來看第一種情況:

tmpfs

大家知道Linux提供一種“臨時”檔案系統叫做tmpfs,它可以將記憶體的一部分空間拿來當做檔案系統使用,使記憶體空間可以當做目錄檔案來用。現在絕大多數Linux系統都有一個叫做/dev/shm的tmpfs目錄,就是這樣一種存在。當然,我們也可以手工建立一個自己的tmpfs,方法如下:

[[email protected] ~]# mkdir /tmp/tmpfs
[[email protected] ~]# mount -t tmpfs -o size=20G none /tmp/tmpfs/

[[email protected] ~]# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda1             10325000   3529604   6270916  37% /
/dev/sda3             20646064   9595940  10001360  49% /usr/local
/dev/mapper/vg-data  103212320  26244284  71725156  27% /data
tmpfs                 66128476  14709004  51419472  23% /dev/shm
none                  20971520         0  20971520   0% /tmp/tmpfs

於是我們就建立了一個新的tmpfs,空間是20G,我們可以在/tmp/tmpfs中建立一個20G以內的檔案。如果我們建立的檔案實際佔用的空間是記憶體的話,那麼這些資料應該佔用記憶體空間的什麼部分呢?根據pagecache的實現功能可以理解,既然是某種檔案系統,那麼自然該使用pagecache的空間來管理。我們試試是不是這樣?

[[email protected] ~]# free -g
             total       used       free     shared    buffers     cached
Mem:           126         36         89          0          1         19
-/+ buffers/cache:         15        111
Swap:            2          0          2
[[email protected] ~]# dd if=/dev/zero of=/tmp/tmpfs/testfile bs=1G count=13
13+0 records in
13+0 records out
13958643712 bytes (14 GB) copied, 9.49858 s, 1.5 GB/s
[[email protected] ~]# 
[[email protected] ~]# free -g
             total       used       free     shared    buffers     cached
Mem:           126         49         76          0          1         32
-/+ buffers/cache:         15        110
Swap:            2          0          2

我們在tmpfs目錄下建立了一個13G的檔案,並通過前後free命令的對比發現,cached增長了13G,說明這個檔案確實放在了記憶體裡並且核心使用的是cache作為儲存。再看看我們關心的指標:    -/+ buffers/cache那一行。我們發現,在這種情況下free命令仍然提示我們有110G記憶體可用,但是真的有這麼多麼?我們可以人工觸發記憶體回收看看現在到底能回收多少記憶體:

[[email protected] ~]# echo 3 > /proc/sys/vm/drop_caches
[[email protected] ~]# free -g
             total       used       free     shared    buffers     cached
Mem:           126         43         82          0          0         29
-/+ buffers/cache:         14        111
Swap:            2          0          2

可以看到,cached佔用的空間並沒有像我們想象的那樣完全被釋放,其中13G的空間仍然被/tmp/tmpfs中的檔案佔用的。當然,我的系統中還有其他不可釋放的cache佔用著其餘16G記憶體空間。那麼tmpfs佔用的cache空間什麼時候會被釋放呢?是在其檔案被刪除的時候.如果不刪除檔案,無論記憶體耗盡到什麼程度,核心都不會自動幫你把tmpfs中的檔案刪除來釋放cache空間。

[[email protected] ~]# rm /tmp/tmpfs/testfile 
[[email protected] ~]# free -g
             total       used       free     shared    buffers     cached
Mem:           126         30         95          0          0         16
-/+ buffers/cache:         14        111
Swap:            2          0          2

這是我們分析的第一種cache不能被回收的情況。還有其他情況,比如:

共享記憶體

共享記憶體是系統提供給我們的一種常用的程序間通訊(IPC)方式,但是這種通訊方式不能在shell中申請和使用,所以我們需要一個簡單的測試程式,由於微信公眾平臺字數限制,程式碼請到我的部落格原文中看。

程式功能很簡單,就是申請一段不到2G共享記憶體,然後開啟一個子程序對這段共享記憶體做一個初始化操作,父程序等子程序初始化完之後輸出一下共享記憶體的內容,然後退出。但是退出之前並沒有刪除這段共享記憶體。我們來看看這個程式執行前後的記憶體使用:

[[email protected] ~]# free -g
             total       used       free     shared    buffers     cached
Mem:           126         30         95          0          0         16
-/+ buffers/cache:         14        111
Swap:            2          0          2
[[email protected] ~]# ./shm 
shmid: 294918
shmsize: 2145386496
shmid: 294918
shmsize: -4194304
Hello!
[[email protected] ~]# free -g
             total       used       free     shared    buffers     cached
Mem:           126         32         93          0          0         18
-/+ buffers/cache:         14        111
Swap:            2          0          2

cached空間由16G漲到了18G。那麼這段cache能被回收麼?繼續測試:

[[email protected] ~]# echo 3 > /proc/sys/vm/drop_caches
[[email protected] ~]# free -g
             total       used       free     shared    buffers     cached
Mem:           126         32         93          0          0         18
-/+ buffers/cache:         14        111
Swap:            2          0          2

結果是仍然不可回收。大家可以觀察到,這段共享記憶體即使沒人使用,仍然會長期存放在cache中,直到其被刪除。刪除方法有兩種,一種是程式中使用shmdt(),另一種是使用ipcrm命令。我們來刪除試試:

[[email protected] ~]# ipcs -m

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
0x00005feb 0          root       666        12000      4                       
0x00005fe7 32769      root       666        524288     2                       
0x00005fe8 65538      root       666        2097152    2                       
0x00038c0e 131075     root       777        2072       1                       
0x00038c14 163844     root       777        5603392    0                       
0x00038c09 196613     root       777        221248     0                       
0x00000000 294918     root       600        2145386496 0                       

[[email protected] ~]# ipcrm -m 294918
[[email protected] ~]# ipcs -m

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
0x00005feb 0          root       666        12000      4                       
0x00005fe7 32769      root       666        524288     2                       
0x00005fe8 65538      root       666        2097152    2                       
0x00038c0e 131075     root       777        2072       1                       
0x00038c14 163844     root       777        5603392    0                       
0x00038c09 196613     root       777        221248     0                       

[[email protected] ~]# free -g
             total       used       free     shared    buffers     cached
Mem:           126         30         95          0          0         16
-/+ buffers/cache:         14        111
Swap:            2          0          2

刪除共享記憶體後,cache被正常釋放了。這個行為與tmpfs的邏輯類似。核心底層在實現共享記憶體(shm)、訊息佇列(msg)和訊號量陣列(sem)這些POSIX:XSI的IPC機制的記憶體儲存時,使用的都是tmpfs。這也是為什麼共享記憶體的操作邏輯與tmpfs類似的原因。當然,一般情況下是shm佔用的記憶體更多,所以我們在此重點強調共享記憶體的使用。說到共享記憶體,Linux還給我們提供了另外一種共享記憶體的方法,就是:

mmap

mmap()是一個非常重要的系統呼叫,這僅從mmap本身的功能描述上是看不出來的。從字面上看,mmap就是將一個檔案對映進程序的虛擬記憶體地址,之後就可以通過操作記憶體的方式對檔案的內容進行操作。但是實際上這個呼叫的用途是很廣泛的。當malloc申請記憶體時,小段記憶體核心使用sbrk處理,而大段記憶體就會使用mmap。當系統呼叫exec族函式執行時,因為其本質上是將一個可執行檔案載入到記憶體執行,所以核心很自然的就可以使用mmap方式進行處理。我們在此僅僅考慮一種情況,就是使用mmap進行共享記憶體的申請時,會不會跟shmget()一樣也使用cache?

同樣,我們也需要一個簡單的測試程式:

[[email protected] ~]# cat mmap.c 
#include <stdlib.h>
#include <stdio.h>
#include <strings.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>

#define MEMSIZE 1024*1024*1023*2
#define MPFILE "./mmapfile"

int main()
{
    void *ptr;
    int fd;

    fd = open(MPFILE, O_RDWR);
    if (fd < 0) {
        perror("open()");
        exit(1);
    }

    ptr = mmap(NULL, MEMSIZE, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANON, fd, 0);
    if (ptr == NULL) {
        perror("malloc()");
        exit(1);
    }

    printf("%p\n", ptr);
    bzero(ptr, MEMSIZE);

    sleep(100);

    munmap(ptr, MEMSIZE);
    close(fd);

    exit(1);
}

這次我們乾脆不用什麼父子程序的方式了,就一個程序,申請一段2G的mmap共享記憶體,然後初始化這段空間之後等待100秒,再解除影射所以我們需要在它sleep這100秒內檢查我們的系統記憶體使用,看看它用的是什麼空間?當然在這之前要先建立一個2G的檔案./mmapfile。結果如下:

[[email protected] ~]# dd if=/dev/zero of=mmapfile bs=1G count=2
[[email protected] ~]# echo 3 > /proc/sys/vm/drop_caches
[[email protected] ~]# free -g
             total       used       free     shared    buffers     cached
Mem:           126         30         95          0          0         16
-/+ buffers/cache:         14        111
Swap:            2          0          2

然後執行測試程式:

[[email protected] ~]# ./mmap &
[1] 19157
0x7f1ae3635000
[[email protected] ~]# free -g
             total       used       free     shared    buffers     cached
Mem:           126         32         93          0          0         18
-/+ buffers/cache:         14        111
Swap:            2          0          2

[[email protected] ~]# echo 3 > /proc/sys/vm/drop_caches
[[email protected] ~]# free -g
             total       used       free     shared    buffers     cached
Mem:           126         32         93          0          0         18
-/+ buffers/cache:         14        111
Swap:            2          0          2

我們可以看到,在程式執行期間,cached一直為18G,比之前漲了2G,並且此時這段cache仍然無法被回收。然後我們等待100秒之後程式結束。

[[email protected] ~]# 
[1]+  Exit 1                  ./mmap
[[email protected] ~]# 
[[email protected] ~]# free -g
             total       used       free     shared    buffers     cached
Mem:           126         30         95          0          0         16
-/+ buffers/cache:         14        111
Swap:            2          0          2

程式退出之後,cached佔用的空間被釋放。這樣我們可以看到,使用mmap申請標誌狀態為MAP_SHARED的記憶體,核心也是使用的cache進行儲存的。在程序對相關記憶體沒有釋放之前,這段cache也是不能被正常釋放的。實際上,mmap的MAP_SHARED方式申請的記憶體,在核心中也是由tmpfs實現的。由此我們也可以推測,由於共享庫的只讀部分在記憶體中都是以mmap的MAP_SHARED方式進行管理,實際上它們也都是要佔用cache且無法被釋放的。

最後

我們通過三個測試例子,發現Linux系統記憶體中的cache並不是在所有情況下都能被釋放當做空閒空間用的。並且也也明確了,即使可以釋放cache,也並不是對系統來說沒有成本的。總結一下要點,我們應該記得這樣幾點:

  1. 當cache作為檔案快取被釋放的時候會引發IO變高,這是cache加快檔案訪問速度所要付出的成本。
  2. tmpfs中儲存的檔案會佔用cache空間,除非檔案刪除否則這個cache不會被自動釋放。
  3. 使用shmget方式申請的共享記憶體會佔用cache空間,除非共享記憶體被ipcrm或者shmdt,否則相關的cache空間都不會被自動釋放。
  4. 使用mmap方法申請的MAP_SHARED標誌的記憶體會佔用cache空間,除非程序將這段記憶體munmap,否則相關的cache空間都不會被自動釋放。
  5. 實際上shmget、mmap的共享記憶體,在核心層都是通過tmpfs實現的,tmpfs實現的儲存用的都是cache。

當理解了這些的時候,希望大家對free命令的理解可以達到我們說的第三個層次。我們應該明白,記憶體的使用並不是簡單的概念,cache也並不是真的可以當成空閒空間用的。如果我們要真正深刻理解你的系統上的記憶體到底使用的是否合理,是需要理解清楚很多更細節知識,並且對相關業務的實現做更細節判斷的。我們當前實驗場景是Centos 6的環境,不同版本的Linux的free現實的狀態可能不一樣,大家可以自己去找出不同的原因。

當然,本文所述的也不是所有的cache不能被釋放的情形。那麼,在你的應用場景下,還有那些cache不能被釋放的場景呢?

轉載至http://blog.csdn.net/bingqingsuimeng/article/details/52084339

相關推薦

Linux記憶體Cache真的回收

在Linux系統中,我們經常用free命令來檢視系統記憶體的使用狀態。在一個RHEL6的系統上,free命令的顯示內容大概是這樣一個狀態: [[email protected] ~]# free             total       used    

influxdb記憶體Cache資料結構詳解

引: 前面TSM檔案格式解析(一到四)綜合分析了不同case下的TSM檔案格式,檔案格式已基本清楚。 寫入磁碟是如此格式,那在寫入磁碟之前的記憶體中是怎麼儲存的呢? 通過第一篇influxdb初探https://blog.csdn.net/jacicson1987/article/det

Linux系統wps不輸入中文問題

版權宣告:本文為博主原創文章,轉載請註明出處。    https://blog.csdn.net/longzhizhui926/article/details/81178853 最近在linux裡使用WPS編輯文件時發現,居然不能輸入中文。這怎麼行!!!我用的是CentOS7

Windows NT類系統清除不防毒軟體清除掉的病毒檔案的方法

不知道大家有沒有遇到過類似的問題?在2000/XP等 Windows系統中我經常遇到一些惡性病毒或者木馬之類的檔案,因為你在正常系統開啟情況下,它已經在未知許可的情況下執行起來了。這時你就是知道它是非法程式,想刪除也刪除不掉,而且有些病毒更是你到了安全模式也跟正常啟動時一樣,

Linux記憶體buff/cache清理

系統頻繁大量讀寫檔案會造成記憶體buff/cache過高,比如:   此時可以用以下命令進行清理: sync;echo 1 >/proc/sys/vm/drop_caches  清理pagecache sync;echo 2 >/proc/sys/vm/drop_caches

linux系統usr/bin/ld誤刪/覆蓋解決方案

今天使用ubuntu系統時,誤將usr/bin/ld檔案覆蓋,導致系統庫連結失敗。解決方案如下: 1、 sudo apt-get install dlocate  安裝dlocate 2、dlocate ld   檢視是否有ld安裝包 3、dlocate ld|less 4

linux記憶體buffer和 cached的比較

經常遇到一些剛接觸Linux的新手會問記憶體佔用怎麼那麼多? 在Linux中經常發現空閒記憶體很少,似乎所有的記憶體都被系統佔用了,表面感覺是記憶體不夠用了,其實不然。這是Linux記憶體管理的一個優秀特性,在這方面,區別於Windows的記憶體管理。主要特點是,無論實

介面以及介面的方法哪些修飾符修飾

當我給介面新增final修飾符時顯示錯誤資訊 Illegal modifier for the interface InterfaceTest; only public & abstract are permitted 即介面只能被public,abstract修

Linux ------清除記憶體cache

首先以Centos6.4的來說,Centos7有些區別 一、buffer/cache/swap的介紹 #cat /etc/redhat-release  #檢視系統版本 CentOS release 6.4 (Final)   #free -m  #檢視緩衝區及記憶體使用

【C】windows在**.exe觸發了一個斷點,其原因可能是堆損壞,解決方案,C記憶體申請釋放TM麻煩,還是python好

寫程式過程中遇到malloc申請記憶體時出現錯誤,錯誤如下: 0x77C1E8FB (ntdll.dll) (Graph.exe 中)處有未經處理的異常: 0xC0000374: 堆已損壞。 (引數: 0x77C54270)        程式除錯過程中,在第一個

LinuxCache記憶體佔用過高解決辦法

在Linux系統中,我們經常用free命令來檢視系統記憶體的使用狀態。在一個RHEL6的系統上,free命令的顯示內容大概是這樣一個狀態: 這裡的預設顯示單位是kb,我的伺服器是128G記憶體,所以數字顯得比較大。這個命令幾乎是每一個使用過Linux的人必會的命令,但越是這樣的命令,似乎真正明白的人越少(

Linux記憶體 Buffer和Cache的區別及Linux檢視記憶體的命令free

一. Linux中檢視記憶體的命令free (1) free檢視的內在預設是以kb為單位,如果想以MB為單位檢視用命令 free -m     二.Linux記憶體 Buffer和Cache的區別 A buffer is something that has ye

angularjs避免轉義,HTMl標識識別,可以正常鏈接,下載!

strong mes logs str style content 代碼 ret .html http://www.cnblogs.com/sxz2008/p/6434036.html如果希望正常解析html代碼,如下: var app = angular.module(‘

LinuxCache內存占用過高解決辦法

格式化 left ack 當前 區別 專業 技術分享 表示 進行 在Linux系統中,我們經常用free命令來查看系統內存的使用狀態。在一個RHEL6的系統上,free命令的顯示內容大概是這樣一個狀態: 這裏的默認顯示單位是kb,我的服務器是128G內存,所以數字顯得

kali linux:wireshark不root用戶啟用的解決方案

9.png -1 bsp .com http 啟用 res 技術分享 img 啟動wireshark後,報錯: 該界面提示在init.lua文件中使用dofile函數禁用了使用超級用戶運行wireshark。這是因為wireshark工具是使用Lua語言編寫的,

LightOJ - 1117 Helping Cicada (求1~n有多少個數不這m個數任意一個整除)(容斥+狀態壓縮)

vol == show fine cst href main http color 題意:http://www.lightoj.com/volume_showproblem.php?problem=1117 考慮1個數k,1~n有[n/k]個數能被k整除,[a]表示a向下取

網易筆試題:找出指定區間數列3整除的個數

字符串 include namespace style 試題 AI () pan string 題目描述:給定一個數列:1,12,123,...,12345678910,1234567891011...,找出指定區間能被3整除的個數。 輸入描述:輸入兩個數字l和r,代表數列

在Red Hat Enterprise Linux 6恢復誤刪除的文件

trac 表示 bbf 具體步驟 rpm -ivh home red tar.bz2 pan 在Red Hat Enterprise Linux 6中恢復被誤刪除的文件 1) 在虛擬機Red Hat Enterprise Linux 6 上添加一塊新的硬盤做實驗準備。如下

SqliteDbOpenHelper的onCreate方法不呼叫

        問題的根源肯定是你的專案中已經有這樣一個數據庫了,所以它一直不會被呼叫,如果onCreate方法一直沒呼叫,可以嘗試換一個數據庫名,即與已經存在的資料庫名區別一下,然後再測試,看onCreate方法是否被呼叫。 再一個就是onCreat

記憶體管理九 linux記憶體頁面回收

一、概序:   在記憶體緊張時,核心會將很少使用的記憶體換出到交換分割槽,以便釋放出實體記憶體,此種機制成為“頁交換”, 也統稱為頁面回收,頁面回收涉及到LRU連結串列、記憶體回收演算法、Kswapd核心執行緒等知識,下面會做相關介紹。 二、LRU連結串列: 1、LRU連結串列: