精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

新華三嵌入式一面:怎么理解Linux下的內存管理?

系統 Linux
在物理內存管理上,Linux 采用分頁機制,將內存劃分為固定大小的頁框,配合伙伴系統處理大塊內存分配,避免碎片化;用 slab 分配器管理內核對象,提升小內存塊的分配效率。

我理解的 Linux 內存管理,是系統內核對內存資源進行分配、回收、保護和優化的一套完整機制,其核心是在有限的物理內存資源下,為多進程提供高效、安全的內存使用環境。從用戶視角看,每個進程都擁有獨立的虛擬地址空間,這讓進程無需關心物理內存的實際分布,簡化了程序開發;而內核層面,通過內存管理單元(MMU)實現虛擬地址到物理地址的映射,既保證了進程間的內存隔離,又能通過地址轉換實現內存共享。

在物理內存管理上,Linux 采用分頁機制,將內存劃分為固定大小的頁框,配合伙伴系統處理大塊內存分配,避免碎片化;用 slab 分配器管理內核對象,提升小內存塊的分配效率。當內存緊張時,系統會基于 LRU 算法回收不常用頁面,或通過 Swap 空間暫存數據,平衡供需。這套機制既解決了物理內存有限的問題,又通過隔離和保護機制保障了系統穩定,對嵌入式場景下的資源優化尤為關鍵。

Part1.Linux 內存管理

1.1物理內存與虛擬內存

物理內存(Physical Memory)是相對虛擬內存而言的,是指通過插在主板內存槽上的物理內存條而獲得的內存空間。物理內存,即 RAM(Random Access Memory,隨機存取存儲器),也叫主存(內存),是與 CPU 直接進行數據交互的內部存儲器。它可以隨時讀寫(刷新時除外),而且速度很快,主要作用是在計算機運行時為操作系統和各種程序提供臨時儲存。看計算機配置的時候,主要看的就是這個物理內存。

圖片圖片

虛擬內存(Virtual Memory,虛擬存儲器)是計算機系統內存管理的一種技術,是指根據系統需要從硬盤勻出來的用來充當內存的那部分空間,主要用于輔助物理內存工作。虛擬內存在硬盤上以 pagefile.sys(分頁文件)存在,大小可以自定義,通常設置為物理內存的1-2倍左右。

(1)為何使用虛擬內存技術?

電腦中運行的所有程序,都需經過內存來執行,若執行的程序占用內存很大或很多,則會導致內存消耗殆盡。為了解決該問題,Windows 運用了虛擬內存技術,即勻出一部分硬盤空間來充當內存使用。若計算機運行程序或操作所需要的 RAM(隨機存儲器)不足時,則 Windows 會用這部分虛擬存儲器進行補償,以緩解內存的緊張。

(2)虛擬內存的工作流程?

虛擬存儲器是由硬件和操作系統自動實現存儲信息調度和管理的,包括6個步驟:

  • ①中央處理器訪問主存的邏輯地址分解成組號a和組內地址b,并對組號a進行地址變換,即將邏輯組號a作為索引,查地址變換表,以確定該組信息是否存放在主存內。
  • ②如該組號已在主存內,則轉而執行④;如果該組號不在主存內,則檢查主存中是否有空閑區,如果沒有,便將某個暫時不用的組調出送往輔存,以便將這組信息調入主存。
  • ③從輔存讀出所要的組,并送到主存空閑區,然后將那個空閑的物理組號a和邏輯組號a登錄在地址變換表中。
  • ④從地址變換表讀出與邏輯組號a對應的物理組號a。
  • ⑤從物理組號a和組內字節地址b得到物理地址。
  • ⑥根據物理地址從主存中存取必要的信息。

虛擬內存技術定義了一個連續的虛擬地址空間,并把內存擴展到硬盤空間。它使得應用程序認為自己擁有連續的可用的內存(一個連續完整的地址空間),而實際上,它通常是被分隔成多個物理內存碎片,還有部分暫時存儲在外部磁盤存儲器上,在需要時進行數據交換。

交換空間(Swap Space)是虛擬內存的重要組成部分,它是磁盤上專門用于虛擬內存的區域。當物理內存不足時,Linux 內核會根據頁面置換算法(如 LRU - 最近最少使用),將某些暫時不活躍的頁面從物理內存移動到交換空間,為其他更需要內存的進程騰出空間。不過,由于磁盤 I/O 速度通常比內存訪問速度慢得多,過度使用交換空間會導致系統性能下降,所以合理配置交換空間的大小非常重要。

一般來說,如果物理內存較小(比如小于 4GB),可以設置 swap 分區大小為內存的 2 倍;如果物理內存大于 4GB 而小于 16GB ,可以設置 swap 分區大小等于物理內存;如果內存大小在 16GB 以上,也可以設置 swap 為 0,但不建議這樣做,因為一定大小的 swap 分區還是有作用的,比如在系統內存緊張時提供一定的緩沖。

1.2分頁機制

分頁是虛擬內存管理中的一種重要機制,它將內存空間劃分為固定大小的塊,這些塊就被稱為頁(page) 。在 Linux 系統中,常見的頁大小是 4KB(2^12 字節),不過在某些架構下,也支持如 64KB 或 2MB 的大頁(Huge Pages) 。之所以采用固定大小的頁,是為了簡化內存管理和提高內存分配的效率。

圖片圖片

頁表(Page Table)是分頁機制的核心數據結構,它就像是一本 “地址字典”,記錄了虛擬頁與物理頁之間的映射關系 。每個進程都擁有自己獨立的頁表,當進程訪問內存時,CPU 會將虛擬地址發送給內存管理單元(MMU) ,MMU 通過查詢頁表,把虛擬地址轉換為對應的物理地址。例如,在 x86_64 架構中,Linux 使用四級頁表結構,分別為頁全局目錄(PGD)、頁上級目錄(PUD)、頁中間目錄(PMD)和頁表項(PTE) 。

當 CPU 接收到一個虛擬地址時,首先會根據虛擬地址的最高幾位在 PGD 中找到對應的 PUD;然后依據虛擬地址的次高幾位在 PUD 中找到對應的 PMD;接著根據虛擬地址的再次高幾位在 PMD 中找到對應的 PTE;最后,PTE 中記錄了該虛擬頁對應的物理頁框地址,從而實現了虛擬地址到物理地址的轉換。

以一個簡單的例子來說明,假設我們有一個進程需要訪問虛擬地址 0x12345678。在四級頁表結構下,MMU 會先提取虛擬地址的高幾位(比如高 9 位,具體位數根據架構和頁表設計而定),通過這幾位索引 PGD,找到對應的 PUD;再從虛擬地址中提取接下來的幾位(同樣根據設計而定),在 PUD 中找到對應的 PMD;然后繼續提取相應位在 PMD 中找到 PTE;最終,PTE 中保存了物理頁框地址,再結合虛擬地址中剩下的偏移部分,就可以得到實際的物理地址,進而訪問到所需的數據 。

Part2.內存管理關鍵技術與組件

2.1內存管理單元(MMU)

內存管理單元(Memory Management Unit,MMU)是Linux內存管理中的關鍵硬件組件,就像是一位 “翻譯官”,承擔著虛擬地址與物理地址之間的轉換工作。當應用程序運行時,它會產生虛擬地址,而MMU的任務就是將這些虛擬地址準確無誤地映射到物理內存地址上,確保程序能夠正確訪問到所需的數據和指令 。

圖片圖片

MMU 主要通過頁表(Page Table)來實現這種映射關系。頁表是一個數據結構,它記錄了虛擬頁到物理頁框的映射信息,每一個虛擬頁在頁表中都有對應的頁表項(Page Table Entry,PTE),頁表項中包含了物理頁框號、訪問權限、修改位等重要信息。當 MMU 接收到虛擬地址時,它會根據虛擬地址中的頁號在頁表中查找對應的頁表項,從而獲取到物理頁框號,再結合虛擬地址中的頁內偏移量,最終得到物理地址 。比如,當一個進程要訪問虛擬地址 0x12345678 時,MMU 會從這個虛擬地址中提取出頁號,假設為 0x123,然后在頁表中查找頁號為 0x123 的頁表項,從該頁表項中獲取到對應的物理頁框號,比如是 0x456,再將物理頁框號與虛擬地址中的頁內偏移量組合起來,得到最終的物理地址 0x4560000 + 0x345678 = 0x456345678,這樣就完成了虛擬地址到物理地址的轉換。

為了加快地址轉換速度,MMU 還引入了快表(Translation Lookaside Buffer,TLB),也叫轉換后備緩沖器。TLB 是一個高速緩存,它存儲了最近使用過的頁表項,當 MMU 進行地址轉換時,會首先在 TLB 中查找,如果 TLB 中存在對應的頁表項(即 TLB 命中),就可以直接從 TLB 中獲取物理頁框號,大大加快了地址轉換速度,減少了內存訪問時間 。

因為如果每次都要去內存中查找頁表,由于內存訪問速度相對較慢,會導致程序運行效率降低。而 TLB 的存在就像是在 MMU 和內存之間建立了一個快速通道,提高了地址轉換的效率。只有在 TLB 中沒有找到對應的頁表項(即 TLB 未命中)時,MMU 才會去內存中的頁表查找。例如,當一個進程頻繁訪問某個虛擬地址范圍時,第一次訪問時可能 TLB 未命中,需要去內存頁表查找,但查找后會將對應的頁表項存入 TLB,后續再次訪問該虛擬地址時,就可以直接在 TLB 中命中,快速完成地址轉換 。

MMU 除了地址轉換功能外,還提供內存保護機制。它通過頁表項中的訪問權限位,如讀權限、寫權限和執行權限,來控制對內存的訪問。當一個進程試圖訪問內存時,MMU 會檢查該進程的訪問權限是否與頁表項中的權限一致,如果不一致,就會觸發一個內存訪問異常,操作系統會捕獲這個異常并進行相應處理,比如終止違規進程,從而防止進程非法訪問內存,保障系統的穩定性和安全性 。比如,一個進程試圖寫入一個只讀的內存頁面,MMU 檢測到這種違規操作后,就會觸發異常,操作系統會介入,避免進程對只讀內存的非法修改,確保內存數據的完整性和系統的正常運行。

3.2伙伴系統(Buddy System)

伙伴系統是 Linux 內核用于管理物理內存的一種重要機制,它主要負責大內存塊的分配和回收,就像一個聰明的倉庫管理員,合理地管理著內存 “倉庫” 中的資源 。其核心思想是將內存劃分為大小為 2 的冪次方的塊,比如 1 個頁框、2 個頁框、4 個頁框、8 個頁框等不同大小的內存塊。這些不同大小的內存塊被組織成 11 個塊鏈表,每個鏈表中存儲著相同大小的空閑內存塊,這樣當有內存分配請求時,伙伴系統可以快速找到合適大小的內存塊進行分配 。

圖片

當內核請求分配內存時,伙伴系統會從相應的塊鏈表中查找與請求大小最匹配的空閑內存塊。如果沒有找到完全匹配的內存塊,它會從更大的內存塊鏈表中選擇一個合適的內存塊,然后將其分割成兩個大小相等的 “伙伴” 內存塊,其中一個用于滿足當前的分配需求,另一個則作為空閑內存塊保留在鏈表中,以備后續分配。例如,當一個進程請求分配 4 個頁框大小的內存時,如果 4 個頁框大小的塊鏈表中沒有空閑塊,伙伴系統會從 8 個頁框大小的塊鏈表中選擇一個空閑塊,將其分割成兩個 4 個頁框大小的伙伴內存塊,一個分配給進程,另一個則放入 4 個頁框大小的塊鏈表中 。

在內存回收階段,當一個內存塊被釋放時,伙伴系統會檢查其伙伴內存塊是否也處于空閑狀態。如果伙伴內存塊是空閑的,就將這兩個伙伴內存塊合并成一個更大的內存塊,并將其放入對應的更大塊鏈表中。這個過程不斷重復,直到無法合并為止 。比如,有兩個相鄰的 4 個頁框大小的空閑內存塊,它們是伙伴關系,當其中一個被釋放后,伙伴系統檢測到其伙伴也空閑,就會將它們合并成一個 8 個頁框大小的內存塊,然后將這個 8 個頁框大小的內存塊放入 8 個頁框大小的塊鏈表中。通過這種方式,伙伴系統可以有效地減少內存碎片的產生,提高內存利用率 。

伙伴系統的這種分配和回收策略,使得內存管理更加高效和有序。它能夠快速響應內存分配請求,并且在內存回收時,盡可能地合并空閑內存塊,避免了內存碎片化問題,為內核提供了穩定的內存資源支持,保證了系統中各種進程和任務的順利運行 。

3.3 slab分配器

slab 分配器是 Linux 內核針對內核對象的內存管理機制,主要用于頻繁分配和釋放小內存塊的場景,它就像是一個專門為小內存塊服務的 “快速補給站” 。在 Linux 內核中,有許多內核對象,如進程描述符、文件描述符、inode 節點等,這些對象的大小通常比較小,而且它們的創建和銷毀非常頻繁,如果使用伙伴系統來分配和回收這些小內存塊,會因為伙伴系統以頁為單位分配內存,粒度較大,容易產生大量的內部碎片,造成內存浪費 。

圖片圖片

slab 分配器通過維護多個不同大小的對象緩存來解決這個問題。對于每一種特定類型和大小的內核對象,slab 分配器都會創建一個對應的緩存(Cache),每個緩存中包含了多個相同大小的內存塊,這些內存塊被稱為對象(Object) 。當內核需要分配一個對象時,slab 分配器會首先檢查對應的緩存中是否有空閑對象,如果有,就直接從緩存中取出一個空閑對象返回給內核,避免了從伙伴系統中重新分配內存的開銷;當對象不再使用時,它會被放回對應的緩存中,而不是釋放回伙伴系統,以便下次分配時可以快速復用 。例如,對于進程描述符(task_struct),slab 分配器會創建一個專門的緩存,當需要創建一個新的進程時,就可以直接從這個緩存中獲取一個空閑的進程描述符對象,而不需要重新向伙伴系統申請內存;當進程結束時,對應的進程描述符對象會被放回緩存,等待下一次使用 。

slab 分配器還引入了 slab 的概念,一個 slab 是由一個或多個連續的物理頁組成,它被劃分為一系列等大小的對象槽位,用于存放對象 。slab 有三種狀態:空閑(free)、部分使用(partial)和滿載(full) 。當一個 slab 中的所有對象都空閑時,它處于空閑狀態;當 slab 中有部分對象被分配出去時,它處于部分使用狀態;當 slab 中的所有對象都被分配時,它處于滿載狀態 。slab 分配器會根據對象的分配和釋放情況,動態調整 slab 的狀態,并且會盡量保持一定數量的空閑 slab,以便快速響應新的內存分配請求 。

slab分配器通過這種緩存機制和對象管理方式,大大提高了小內存塊的分配和回收效率,減少了內存碎片的產生,同時還可以對內核對象進行預初始化,進一步提高了系統性能,是 Linux 內核內存管理中不可或缺的一部分 。

Part3.內存分配與回收機制

3.1內存分配流程

在 Linux 系統中,內存分配根據所處的運行環境分為用戶態和內核態兩種情況,各自有著不同的分配過程和系統調用。

用戶態下,當我們編寫 C 語言程序時,經常會用到malloc函數來分配內存 。malloc函數是 C 標準庫提供的內存分配函數,它并非直接與內核交互,而是在用戶空間內管理內存。malloc的底層實現依賴于操作系統提供的系統調用,主要涉及brk和mmap 。當程序調用malloc請求分配內存時,malloc首先會檢查其維護的內存池(堆內存)中是否有足夠大小的空閑內存塊 。

如果有,就直接從內存池中分配一塊合適的內存返回給程序;如果內存池中沒有足夠的空閑內存,malloc會根據請求內存的大小來決定下一步操作 。如果請求的內存較小,它會嘗試通過brk系統調用擴展堆內存(即移動break指針,break指針指向堆空間的某個地址,從堆起始地址到break之間的地址空間為映射好的,可以供進程訪問 ),然后從新擴展的堆內存中分配內存塊給程序 。

例如,一個程序調用malloc(1024)請求分配 1024 字節的內存,malloc在檢查內存池后發現空間不足,就可能通過brk擴展堆內存,然后從新擴展的區域中劃出 1024 字節返回給程序 。如果請求的內存較大(通常大于 128KB,這個閾值在不同系統中可能會有所不同),malloc會使用mmap系統調用直接向內核申請一塊獨立的內存映射區域,將文件或者設備映射到進程的地址空間,這塊內存區域獨立于堆內存,并且在使用完畢后可以直接通過munmap系統調用釋放,而不會與堆內存產生關聯 。比如,當一個程序需要加載一個較大的共享庫文件時,就可能通過mmap將共享庫文件映射到進程地址空間,方便程序對其進行訪問 。

內核態下的內存分配則更為復雜和關鍵,因為內核負責管理整個系統的內存資源,為各種內核對象和進程提供內存支持 。內核主要通過伙伴系統和 slab 分配器來進行內存分配 。當內核需要分配大塊內存(通常以頁為單位,一頁大小一般為 4KB 或 8KB)時,會使用伙伴系統 。伙伴系統將物理內存劃分為大小為 2 的冪次方的塊,這些不同大小的內存塊被組織成 11 個塊鏈表 。當內核請求分配內存時,伙伴系統會從相應的塊鏈表中查找與請求大小最匹配的空閑內存塊 。如果沒有找到完全匹配的內存塊,它會從更大的內存塊鏈表中選擇一個合適的內存塊,然后將其分割成兩個大小相等的 “伙伴” 內存塊,其中一個用于滿足當前的分配需求,另一個則作為空閑內存塊保留在鏈表中 。

例如,內核請求分配 8 個頁框大小的內存,如果 8 個頁框大小的塊鏈表中沒有空閑塊,伙伴系統會從 16 個頁框大小的塊鏈表中選擇一個空閑塊,將其分割成兩個 8 個頁框大小的伙伴內存塊,一個分配給內核,另一個放入 8 個頁框大小的塊鏈表 。對于頻繁分配和釋放的小內存塊,內核使用 slab 分配器 。slab 分配器針對每一種特定類型和大小的內核對象,維護了多個不同大小的對象緩存 。

當內核需要分配一個對象時,slab 分配器會首先檢查對應的緩存中是否有空閑對象,如果有,就直接從緩存中取出一個空閑對象返回給內核;當對象不再使用時,它會被放回對應的緩存中,而不是釋放回伙伴系統,以便下次分配時可以快速復用 。比如,對于進程描述符(task_struct),slab 分配器會創建一個專門的緩存,當需要創建一個新的進程時,就可以直接從這個緩存中獲取一個空閑的進程描述符對象 。

3.2內存回收策略

Linux 系統采用了多種內存回收策略來確保系統內存的高效利用和穩定運行,其中 “最近最少使用(LRU)” 算法是內存回收的核心算法之一 。Linux 內核維護了兩個雙向鏈表,分別是活躍內存頁鏈表(active_list)和不活躍內存頁鏈表(inactive_list) 。active_list中存放的是進程經常訪問的內存頁,這些內存頁被認為是活躍的,在內存回收時一般不會被淘汰 ;而inactive_list中則是進程很少訪問的內存頁,這些不活躍的內存頁是內存回收的主要目標 。

每個內存頁都有一個PG_referenced標志位,表示此內存頁是否被訪問過,這個標志位在內存回收過程中起著至關重要的作用 。當某個進程申請一個匿名內存頁時,內核會把這個內存頁添加到active_list中,并且將PG_referenced標志位設置為 0 。如果內存頁原來處于active_list中,再次被訪問時,會把此內存頁的PG_referenced設置為 1 。當某個處于inactive_list鏈表中且PG_referenced為 0 的內存頁被訪問時,也會將其PG_referenced值變為 1 ;當某個處于inactive_list鏈表中且PG_referenced為 1 的內存頁被訪問時,會將此內存頁移動到active_list,并且將PG_referenced置為 0 。

當系統內存不足時,內核會從inactive_list的尾部開始進行內存淘汰 。如果內存頁的PG_referenced標志位為 1,說明該內存頁最近被訪問過,將跳過此內存頁,并且將此內存頁的PG_referenced標志位設置為 0 ;如果內存頁的PG_referenced標志位為 0,那么將此內存頁寫入到磁盤當中(如果是匿名內存頁,會寫入到交換分區;如果是與文件映射的內存頁,會寫回到文件),并且將所有與此內存頁的映射解除綁定,然后釋放此內存頁 。在淘汰的過程中,active_list鏈表中的內存頁也要進行衰退,掃描active_list鏈表,當其PG_referenced值為 1 時將其置為 0,當值為 0 時,要將其從active_list鏈表移到inactive_list鏈表中 ,這樣可以保證active_list中始終是最活躍的內存頁 。

除了基于LRU算法的內存回收,Linux還會在特定情況下進行頁面交換操作,也就是將內存中的數據交換到磁盤的交換空間(Swap Space) 。當系統內存緊張,可用內存不足時,內核會觸發swap機制 。對于匿名內存頁(如進程的堆、棧、數據段等沒有與文件映射的內存頁),如果系統設置了交換分區或交換文件,內核會將這些匿名內存頁寫入到交換分區中,釋放出物理內存供其他更需要的進程使用 。

而對于與文件有映射關系的內存頁(如代碼段、mmap 段等),只需要將數據寫回到文件即可(代碼段內容一般不會改變,所以不用回寫) 。例如,當一個占用大量內存的程序在運行時,系統內存逐漸緊張,內核可能會將該程序中一些不常用的匿名內存頁交換到交換分區,釋放出物理內存給其他進程使用 。當該程序后續需要再次訪問這些被交換出去的內存頁時,會產生缺頁異常,內核會從交換分區中將相應的內存頁讀取回物理內存 。

內核通過 kswapd 內核線程來進行內存回收的監控和處理 。kswapd 線程會定期檢查系統內存的使用情況,當剩余內存慢慢減少,觸碰到 low 水位時,就會觸發 kswapd 線程的內存回收工作 。它會根據 LRU 算法對不活躍的內存頁進行回收,將其寫入磁盤或交換分區,釋放物理內存 。如果在回收過程中,內存慢慢增加,觸碰到 high 水位時,就會停止回收 。每個內存區域(zone)都有自己的 low、min 和 high 水位,并且 kswapd 線程是針對所在 node(節點)進行內存回收的,只會對分配了一定數量頁框后空閑頁框數量小于此 zone 的 high 閥值加上保留頁框數量的 zone 進行內存回收 。

此外,用戶也可以通過修改/proc/sys/vm/swapness參數來控制內存回收時對匿名頁和文件緩存頁的回收傾向 。swapness的值表示系統將內存頁交換到磁盤交換空間的傾向程度,取值范圍是0 - 100 。當swapness值較大時,系統會更積極地回收匿名頁,將其交換到交換空間;當值較小時,系統則更傾向于回收文件緩存頁 。例如,將 swapness設置為10,表示系統在內存回收時,只有當內存非常緊張時才會較多地使用交換空間來回收匿名頁 。

Part4.監控與優化內存使用

4.1監控工具使用

在 Linux 系統中,有許多實用的工具可以幫助我們監控內存使用情況,及時發現潛在問題。

free命令是最常用的內存監控命令之一,它能快速展示系統內存的使用概況 。使用free -h命令(-h參數表示以人類可讀的格式顯示),會輸出類似這樣的信息:

total        used        free      shared  buff/cache   available
Mem:           7.8Gi       317Mi       6.0Gi       1.0Mi       1.4Gi       7.2Gi
Swap:          4.0Gi          0B       4.0Gi

其中,total表示系統內存總量;used是已使用的內存量;free為空閑內存量;shared是被多個進程共享的內存量;buff/cache是用于文件系統緩存和緩沖區的內存量;available則是在不影響系統性能的情況下可分配給新進程的大約內存量 。通過觀察這些數據,我們能直觀了解系統內存的整體使用狀態,比如當used接近total時,可能意味著系統內存不足 。

top命令提供了實時的系統監控視圖,不僅能查看內存使用情況,還能展示 CPU、進程等信息 。在終端輸入top命令后,會看到一個動態更新的界面,按下Shift + M可以按照內存使用量對進程進行排序,方便找出占用內存較多的進程 。例如,當系統運行緩慢時,通過top查看內存占用大戶,可能會發現某個進程占用了大量內存,這就需要進一步排查該進程是否存在內存泄漏或不合理的內存使用情況 。在top命令的輸出中,VIRT表示進程使用的虛擬內存總量;RES是進程使用的、未被換出的物理內存大小;SHR為共享內存大小 。計算一個進程實際使用的內存可以用RES - SHR 。通過這些指標,我們能深入分析每個進程的內存使用細節 。

vmstat命令可以展現給定時間間隔的服務器的狀態值,包括 CPU 使用率、內存使用率、虛擬內存交換情況、I/O 讀寫情況等 。使用vmstat 2(表示每 2 秒采集一次數據)命令,會得到如下輸出示例:

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r  b swpd   free   buff cache   si   so    bi bo   in   cs us sy id wa st
1 0 0 4777576 153688 1299500 0 0 0 1500 2098 0 0 98 0 0

其中,swpd表示使用的虛擬內存大小;free是可用的物理內存大小;si為每秒從交換分區讀入到 RAM 的大小;so是每秒從 RAM 寫出到交換分區的大小 。如果swpd大于 0 且si、so的值長期不為 0,說明系統在頻繁進行內存和交換空間的數據交換,可能存在內存不足的問題,會影響系統性能 。

除了這些命令行工具,我們還可以通過/proc/meminfo文件獲取內存信息 。這是一個動態更新的虛擬文件,包含了豐富的內存使用情況報告 。使用cat /proc/meminfo命令查看,會輸出類似下面的內容:

MemTotal:        3855952 kB
MemFree:         2040864 kB
MemAvailable:    3356504 kB
Buffers:          39224 kB
Cached:          1400764 kB
SwapCached:          0 kB
Active:           86028 kB
Inactive:       1536020 kB
Active(anon):      244 kB
Inactive(anon):  182156 kB
Active(file):     85784 kB
Inactive(file): 1353864 kB
Unevictable:         0 kB
Mlocked:             0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                 96 kB
Writeback:             0 kB
AnonPages:         179504 kB
Mapped:            215608 kB
Shmem:               336 kB
KReclaimable:      123612 kB
Slab:              148076 kB
SReclaimable:      123612 kB
SUnreclaim:         24464 kB
KernelStack:        2912 kB
PageTables:         2984 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     1927976 kB
Committed_AS:    482236 kB
VmallocTotal:   34359738367 kB
VmallocUsed:       16208 kB
VmallocChunk:          0 kB
Percpu:             1016 kB
HardwareCorrupted:     0 kB
AnonHugePages:     104448 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
FileHugePages:         0 kB
FilePmdMapped:         0 kB

這個文件中的各項數據詳細記錄了系統內存的各個方面,如總內存(MemTotal)、空閑內存(MemFree)、可用內存(MemAvailable)、緩沖區(Buffers)、緩存(Cached)等 。它是許多內存監控工具的數據源,通過直接分析這個文件,我們可以獲取更全面和深入的內存信息 。例如,MemAvailable是內核使用特定算法估算出來的可分配給應用程序的內存數量,它比MemFree更能反映系統實際可用的內存情況 。當我們在排查內存問題時,/proc/meminfo中的數據能為我們提供重要的參考依據 。

4.2優化策略

當我們通過監控工具發現系統內存使用存在問題時,就需要采取相應的優化策略來提升系統性能。

調整交換空間大小是一種常見的優化手段。如果系統內存不足,合理增加交換空間可以緩解內存壓力。比如在安裝系統時,默認分配的交換空間較小,隨著系統使用和應用程序的增加,可能需要擴大交換空間 。可以通過添加 swap 分區或創建 swap 文件的方式來實現 。首先,使用fdisk或parted工具查看磁盤分區情況,確定哪些分區可以用于創建 swap 分區 。假設要在一塊新磁盤上創建 swap 分區,使用fdisk工具對新磁盤進行分區操作,創建一個新分區并將其標記為 swap 類型 。

然后,使用mkswap命令格式化新的 swap 分區,例如mkswap /dev/sda3(假設新分區為/dev/sda3) 。最后,使用swapon命令啟用新的 swap 分區,即swapon /dev/sda3 。如果不想使用新磁盤分區,也可以創建 swap 文件 。使用dd命令創建一個指定大小的文件,如dd if=/dev/zero of=/swapfile bs=1M count=2048表示創建一個大小為 2GB 的 swap 文件 。

接著,使用mkswap命令將其格式化為 swap 文件,mkswap /swapfile 。最后,使用swapon命令啟用 swap 文件,swapon /swapfile 。在調整交換空間大小時,要注意確保系統中的 swap 空間大小能夠滿足系統運行的需求,但也不能設置過大,因為過度使用交換空間會導致系統性能下降,一般建議根據物理內存大小來合理設置 swap 空間大小 。

優化應用程序的內存使用是提高系統性能的關鍵。從程序設計角度來看,要避免內存泄漏問題 。在 C 語言中,使用malloc分配內存后,一定要記得使用free釋放內存,否則會導致內存泄漏 。例如:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int *ptr = (int *)malloc(10 * sizeof(int));
    if (ptr == NULL) {
        printf("內存分配失敗\n");
        return 1;
    }
    // 使用ptr
    // 這里忘記釋放ptr所指向的內存,會導致內存泄漏
    return 0;
}

在上述代碼中,如果忘記在程序結束前調用free(ptr)釋放內存,隨著程序多次運行,會不斷占用內存,最終導致系統內存不足 。對于大型項目,可以使用內存檢測工具如valgrind來檢測內存泄漏和其他內存錯誤 。在 Java 中,要注意對象的生命周期管理,及時釋放不再使用的對象,避免對象長時間占用內存 。例如,當一個對象不再被使用時,應將其引用設置為null,以便垃圾回收器(GC)能夠及時回收其占用的內存 。

此外,還可以通過調整 Java 虛擬機(JVM)的參數來優化內存使用,如設置堆內存的大小 。可以使用-Xms和-Xmx參數來分別設置 JVM 初始堆大小和最大堆大小 。例如,java -Xms512m -Xmx1024m MyApp表示設置 JVM 初始堆大小為 512MB,最大堆大小為 1024MB 。合理設置這些參數可以避免 JVM 頻繁進行垃圾回收,提高程序的性能 。

除了上述方法,還可以通過優化系統配置來提高內存使用效率。比如調整/proc/sys/vm/swappiness參數,它表示系統將內存頁交換到磁盤交換空間的傾向程度,取值范圍是 0 - 100 。當swappiness值較大時,系統會更積極地回收匿名頁,將其交換到交換空間;當值較小時,系統則更傾向于回收文件緩存頁 。如果系統內存充足,可以將swappiness設置為較小的值,如 10,減少不必要的內存交換操作,提高系統性能 。可以通過編輯/etc/sysctl.conf文件,添加或修改vm.swappiness = 10,然后執行sysctl -p使配置生效 。

責任編輯:武曉燕 來源: 深度Linux
相關推薦

2011-11-08 15:40:47

LwIP協議棧嵌入式

2011-01-14 13:13:23

嵌入式Linux開發

2009-12-24 17:21:38

嵌入式Linux

2022-01-03 23:33:40

Linux組件系統

2022-01-04 22:19:38

Linux開發嵌入式

2025-03-07 00:11:00

JWTJSONSession

2009-12-16 15:41:40

嵌入式Linux入門

2009-12-17 10:33:05

嵌入式Linux

2009-12-09 10:12:28

嵌入式Linux

2025-07-29 02:00:00

2014-09-02 09:45:57

Linux

2009-08-27 10:28:04

2009-12-24 17:27:52

嵌入式Linux

2020-07-03 07:00:00

Linux組件

2011-08-05 09:11:56

2010-09-25 15:05:49

LINUXJVM

2021-12-19 22:34:45

Linux容器系統

2009-12-09 10:50:53

嵌入式Linux

2009-12-23 16:52:26

Linux自學嵌入式

2009-06-26 16:05:04

嵌入式Linux
點贊
收藏

51CTO技術棧公眾號

美国一区二区| 在线欧美三级| 青草av.久久免费一区| 自拍偷拍免费精品| 三级黄色片免费看| 99re6在线精品视频免费播放| 91在线国产福利| 国产精品久久久久久久久| 可以免费看av的网址| 午夜久久av| 欧美午夜精品久久久久久浪潮| 色播亚洲婷婷| 亚洲精品911| 日韩制服丝袜av| 搡老女人一区二区三区视频tv| 中文字幕第10页| 桃花岛tv亚洲品质| 亚洲精品视频免费观看| 久久久久久久有限公司| 国产精品久久久久毛片| 一本色道久久综合| 久99久在线视频| 国产精品成人无码免费| www.豆豆成人网.com| 欧美性xxxxxx少妇| 成人黄色av片| fc2ppv国产精品久久| 国产亚洲欧美日韩俺去了| 91九色露脸| 中文 欧美 日韩| 亚洲专区一区二区三区| 欧美精品一区三区| 九一在线免费观看| 亚洲日产av中文字幕| 精品人在线二区三区| 伊人国产在线视频| 美脚恋feet久草欧美| 亚洲伊人色欲综合网| 宅男av一区二区三区| 精彩国产在线| 99re8在线精品视频免费播放| 亚洲综合在线小说| 国产精品久久久久久久久久久久久久久久 | 韩国av免费在线| 狠狠色综合播放一区二区| 日产日韩在线亚洲欧美| 日本少妇性高潮| 在线播放一区| 欧美激情国产精品| 久艹视频在线观看| 亚洲欧美综合国产精品一区| 久久精品久久久久久国产 免费| 天堂在线中文视频| 国产精品探花在线观看| 日韩精品在线免费播放| 国产xxxx视频| 久久a级毛片毛片免费观看| 日韩一区二区三区av| 一二三av在线| 涩爱av色老久久精品偷偷鲁| 日韩三级av在线播放| 激情图片中文字幕| 国产亚洲精aa在线看| 91精品国产一区二区| 国产性生活一级片| 国产aa精品| 日韩欧美www| 国产午夜在线一区二区三区| 成人av激情人伦小说| 精品播放一区二区| 黄色免费视频网站| 日韩av黄色在线| 亚洲精品之草原avav久久| 全黄一级裸体片| 国产精品免费不| 中文字幕欧美日韩| www日韩在线| 狠狠久久婷婷| 欧美一级淫片aaaaaaa视频| 99久久久久久久久| 蜜臀av性久久久久蜜臀aⅴ | 亚洲成熟少妇视频在线观看| 日韩精品亚洲一区| 成人av在线网址| 精品国产乱码久久久久久丨区2区| 日韩免费一二三区| 中文一区在线| 国产精品第3页| 国产影视一区二区| 国产白丝精品91爽爽久久| 国产一区二区精品免费| 国产中文字幕在线播放| 亚洲欧洲精品一区二区三区| 欧美交换配乱吟粗大25p| аⅴ资源天堂资源库在线| 色网综合在线观看| 亚洲无在线观看| 精品视频在线你懂得| 亚洲天堂av在线免费观看| 潘金莲一级黄色片| 亚洲黄页一区| 国产色综合天天综合网| 男人天堂一区二区| 中文字幕不卡在线播放| 男女激情免费视频| 91av一区| 精品粉嫩aⅴ一区二区三区四区| 亚洲精品视频久久久| 成人精品电影| 久久久爽爽爽美女图片| 伊人免费在线观看| 99在线精品视频| 一区二区三区四区五区视频 | 精品一区二区男人吃奶| 在线观看日韩专区| 特级片在线观看| 免费日本视频一区| 国产一区精品视频| 免费黄色在线看| 一本在线高清不卡dvd| 操人视频免费看| 国产欧美日韩精品一区二区免费| 欧美多人乱p欧美4p久久| 中文字幕免费观看| 成人免费观看男女羞羞视频| 日韩视频在线观看视频| 久久sese| 日韩电视剧免费观看网站| 中文字幕在线观看成人| 蜜桃av一区二区| 欧美日韩在线精品| 麻豆网站免费在线观看| 日韩精品一区二区三区老鸭窝| 国产激情av在线| 久久性色av| 麻豆精品传媒视频| 国产黄色大片在线观看| 91精品国产综合久久香蕉麻豆| 性高潮久久久久久久| 在线亚洲自拍| 国产尤物91| 国产黄色大片在线观看| 欧美一区二区三区色| 午夜激情福利电影| 日本亚洲天堂网| 欧美日韩在线精品| 久久人体大尺度| 亚洲区免费影片| 免费av网站在线| 99国产精品国产精品毛片| www.日本三级| 一本一道久久a久久| 欧美国产中文字幕| 亚洲国产中文字幕在线| 一区二区三区精品在线| 欧美老女人bb| 亚洲二区在线| 狼狼综合久久久久综合网| 美女的胸无遮挡在线观看| 亚洲国产精品成人精品| 五月天婷婷网站| 成人免费的视频| 九九爱精品视频| 日韩极品在线| 91国内在线视频| 四虎影视精品成人| 欧美视频在线看| 91成人破解版| 日日夜夜精品视频免费| 四虎一区二区| 4438五月综合| 欧美精品999| 青青草在线免费视频| 色婷婷综合中文久久一本| 精品日韩在线视频| 国产美女主播视频一区| 2019日韩中文字幕mv| 色哟哟精品丝袜一区二区| 日韩美女视频在线观看| 在线播放日本| 日韩欧美激情在线| 国产一区二区三区影院| 久久久国产一区二区三区四区小说| 男人透女人免费视频| 日韩欧美二区| 亚洲最大激情中文字幕| 黄色aa久久| 亚洲视频国产视频| a级片免费观看| 疯狂做受xxxx高潮欧美日本| 懂色av粉嫩av浪潮av| 国产精品一区二区果冻传媒| 91专区在线观看| 日本一区二区免费高清| 97中文在线| 亚洲wwww| 欧美大片欧美激情性色a∨久久| 午夜视频福利在线| 8x福利精品第一导航| 日韩免费黄色片| 中文字幕一区二区三区视频| 人妻体内射精一区二区三区| 蜜臀av性久久久久蜜臀aⅴ| 国产一二三区在线播放| 成人羞羞视频播放网站| 国产成人免费电影| 99久久亚洲国产日韩美女| 欧美极品欧美精品欧美视频| a视频网址在线观看| 亚洲成人精品av| 91丨九色丨丰满| 欧美色视频日本高清在线观看| 婷婷社区五月天| 国产亚洲一区二区三区在线观看| 亚洲欧洲日韩综合| 麻豆精品一区二区综合av| r级无码视频在线观看| 999视频精品| 欧美资源一区| 加勒比中文字幕精品| 亚洲va电影大全| 国产精品黄色片| 日本亚洲精品在线观看| 里番在线播放| 久久夜精品va视频免费观看| 成人在线高清视频| 日韩电影中文字幕| 成人乱码一区二区三区| 在线播放国产精品二区一二区四区| 99re这里只有精品在线| 亚洲福中文字幕伊人影院| 天天综合天天做| 国产精品电影一区二区| av在线播放中文字幕| 国产午夜精品在线观看| 熟妇高潮精品一区二区三区| 国产精品88av| 五月六月丁香婷婷| 久久99深爱久久99精品| 男人搞女人网站| 日韩电影在线看| 黄色片视频在线播放| 中国女人久久久| 日韩av高清在线看片| 亚洲三级影院| 成人性生活视频免费看| 伊人精品视频| 麻豆tv在线播放| 在线亚洲自拍| 红桃av在线播放| 国产麻豆综合| 超碰影院在线观看| 日韩影院在线观看| 国产一线二线三线在线观看| 日本少妇一区二区| 天天干天天爽天天射| 久久99久久精品欧美| 中国黄色片一级| 国产一区二三区| 可以看的av网址| 成人免费三级在线| jizz欧美性20| 久久久午夜精品理论片中文字幕| 一道本在线观看| 国产精品蜜臀在线观看| 欧美激情精品久久久久久免费 | 国产又粗又长又硬| 成人欧美一区二区三区小说 | 精品国产一区二区三区噜噜噜| 日韩精品不卡| 国产精品不卡| 免费看日本黄色| 日韩视频久久| 爱情岛论坛成人| 久久99精品一区二区三区 | 日韩欧国产精品一区综合无码| 国产精品专区一| 精品一区二区三区中文字幕| 国产精品一区二区a| 美女少妇全过程你懂的久久| 婷婷四房综合激情五月| 亚洲午夜精品一区二区国产| www.日本在线视频| 爽好多水快深点欧美视频| 午夜精品久久久久久久99热影院| 懂色av一区二区三区免费看| 少妇精品一区二区三区| 国产精品你懂的| 欧美成人精品激情在线视频| 欧美性猛交99久久久久99按摩| 中文字幕人妻丝袜乱一区三区| 日韩一区二区视频在线观看| 亚洲三区在线观看无套内射| 中文字幕亚洲一区| av最新在线| 国产日韩欧美在线看| 欧美电影在线观看免费| 婷婷视频在线播放| 国产日产高清欧美一区二区三区| 欧美精品久久久久久久久25p| 国产成人精品亚洲777人妖| 成人免费网站黄| 亚洲精品高清在线| 中文字幕视频在线播放| 精品动漫一区二区三区在线观看| 99riav在线| 97精品久久久中文字幕免费| 精品九九久久| 久久国产精品-国产精品| 国产精品久久久久久影院8一贰佰 国产精品久久久久久麻豆一区软件 | 樱花草涩涩www在线播放| 成人国产亚洲精品a区天堂华泰| 日韩福利视频一区| 日韩精品一区二区三区电影| 日本少妇一区二区| 欧美精品黑人猛交高潮| 亚洲视频一二三| 欧美在线视频精品| 日韩精品欧美国产精品忘忧草 | 久久久久久久一区二区三区| 成人高清一区| 欧美日本韩国一区二区三区| 99精品福利视频| 无码人妻少妇色欲av一区二区| 中文字幕精品—区二区四季| 国内精品福利视频| 精品国产123| 日本天码aⅴ片在线电影网站| 国产乱肥老妇国产一区二| 国产精品手机在线播放| 欧美a在线视频| 不卡的av在线播放| 久久精品一级片| 欧美一区二区视频在线观看2022 | 91丨porny丨国产入口| 欧美日韩精品在线观看视频 | www.国产麻豆| 久久综合亚洲社区| 欧美少妇激情| 午夜精品区一区二区三| 久久久久久夜| 美女被到爽高潮视频| 色狠狠av一区二区三区| 男女污污视频在线观看| 日本高清久久天堂| 亚洲婷婷影院| 国产精品少妇在线视频| 久久久久久久久一| 国产精品久久久久久久久久精爆| 日韩av网站在线| 手机av在线| 欧美亚洲另类在线一区二区三区| 鲁大师成人一区二区三区| 欧美做受xxxxxⅹ性视频| 色欧美片视频在线观看 | 日韩成人精品| 69精品丰满人妻无码视频a片| 国产传媒久久文化传媒| 久久久久久久久久一区二区三区 | 国产精品久久久精品| 成人3d动漫在线观看| 国产一级做a爰片久久| 国产精品久久久久久久久动漫| 91亚洲精品国偷拍自产在线观看 | 日韩电影一二三区| 日本综合在线观看| 在线成人免费视频| 色呦呦呦在线观看| 国产综合欧美在线看| 亚洲影音先锋| 久久免费手机视频| 欧美一区二区三区免费| 久操av在线| 欧美日韩最好看的视频| 麻豆精品国产传媒mv男同| 国产第一页浮力| 亚洲第一天堂av| 日本韩国欧美| 中文一区一区三区免费| 成人性视频免费网站| 久久久蜜桃一区二区| 久久亚洲精品一区| 欧美理论电影在线精品| www.99在线| 亚洲最新视频在线播放| 欧洲成人av| 91九色国产视频| 亚洲少妇诱惑| 国精品人伦一区二区三区蜜桃| 欧美成va人片在线观看| 大胆人体一区二区| 91xxx视频| 91麻豆精东视频| 国产三级午夜理伦三级| 97视频免费看| 手机在线一区二区三区| 精品熟女一区二区三区| 欧美日本乱大交xxxxx| av影片在线| 一个色的综合|