精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

一级黄色录像在线观看| 国产精品久久国产精品| 五月激情四射婷婷| 99国内精品久久久久| 亚洲天堂成人网| 国产91一区二区三区| 九一国产在线观看| 日韩免费一区| 日韩免费视频线观看| 日韩五码在线观看| 福利视频在线导航| 国产精品一二三区| 日本最新高清不卡中文字幕| 日韩欧美国产成人精品免费| 欧美一级全黄| 在线不卡的av| 黄色片久久久久| 最新日本在线观看| 国产日韩精品一区二区三区| 亚洲一区二区三区视频播放| 日韩久久中文字幕| 欧美在线不卡| 日韩精品一区二区视频| 亚洲天堂av一区二区三区| 亚洲天堂手机| 亚洲综合丁香婷婷六月香| 日韩精品久久一区| 男人天堂综合网| 国产最新精品免费| 国产mv免费观看入口亚洲| 国产一区二区三区在线观看视频| 视频一区二区综合| 亚洲精品成人电影| 久久 天天综合| 日韩av色在线| 日本少妇做爰全过程毛片| 99久久精品国产亚洲精品| 亚洲精品美女免费| 亚洲av综合色区无码另类小说| 亚洲精品在线影院| 欧美日韩另类在线| 成人av在线不卡| 免费在线观看黄色网| 国产欧美在线观看一区| 久久精品美女| 天天干天天色天天| 国产成人av影院| 91久久精品国产91性色| 日韩女同一区二区三区 | 欧美最猛性xxxx| 国产午夜视频在线播放| 午夜天堂精品久久久久| 久久视频在线免费观看| www深夜成人a√在线| 日本午夜一区| 中文字幕久久精品| 国产一区二区三区精品在线| 国产免费播放一区二区| 亚洲欧洲日本专区| 精品无码一区二区三区 | 欧美aaaaa成人免费观看视频| 欧洲成人性视频| 国产精品自拍99| 亚洲经典视频在线观看| 国内精品小视频在线观看| 麻豆一区二区三区精品视频| 激情视频一区二区三区| 欧美激情一区二区三区高清视频| 久久黄色小视频| 天天综合亚洲| 久久99视频免费| 欧美一级高潮片| av不卡在线| 日韩av电影手机在线| 国产美女www| 麻豆国产精品官网| 91啪国产在线| 亚洲AV无码精品国产| av不卡在线观看| 日本视频一区二区在线观看| youjizz在线播放| 亚洲欧洲精品一区二区三区| 国产系列第一页| 欧美卡一卡二| 欧美视频国产精品| 向日葵污视频在线观看| 久久国产精品美女| 亚洲国产精品一区二区久| www.色多多| 第一会所sis001亚洲| 久久精品中文字幕电影| 中文字幕第28页| 可以看av的网站久久看| 成人国产精品久久久久久亚洲| a天堂在线视频| 99re免费视频精品全部| 日韩中文字幕一区| 2021国产在线| 欧美影院一区二区| 欧美体内she精高潮| 亚洲色图丝袜| 欧美久久精品一级黑人c片| 日韩精品1区2区| 精品一区二区日韩| 欧美精品一区二区三区在线四季| 日本电影在线观看网站| 午夜日韩在线观看| 久久国产激情视频| 欧美jizz19性欧美| 久久夜色精品亚洲噜噜国产mv| 日本一区二区不卡在线| 蜜桃视频在线一区| 精品视频一区在线| 麻豆视频免费在线观看| 丁香花电影在线观看完整版| 久久久国际精品| 9999在线观看| 最新日韩三级| 欧美精品一区二| 天堂а√在线中文在线鲁大师| 亚洲国产免费看| 3d动漫精品啪啪一区二区三区免费| 女人偷人在线视频| 亚洲成人av中文| 无套内谢丰满少妇中文字幕 | 欧美日韩三区四区| 婷婷av在线| 欧美日韩国产成人在线91| 少妇精品一区二区| 亚洲午夜激情在线| 成人福利网站在线观看| 国产精品一二三区视频| 婷婷国产在线综合| 娇妻高潮浓精白浆xxⅹ| 午夜精品一区二区三区国产 | 久久久亚洲高清| 欧美精品久久久久久久自慰| 日本免费精品| 久久精品夜夜夜夜夜久久| 亚洲视频在线免费播放| 欧美国产一区二区| 青青草av网站| 久久成人高清| 国产www精品| 毛片在线播放网址| 色香蕉成人二区免费| 人妻丰满熟妇aⅴ无码| 日韩视频精品在线观看| 国产一区二区免费电影| www.youjizz.com在线| 精品国精品自拍自在线| 97神马电影| 狂野欧美性猛交| 蜜桃视频一区二区三区在线观看| 蜜桃999成人看片在线观看| 香蕉国产成人午夜av影院| 亚洲日韩第一页| 久久久久久少妇| 91免费国产在线| 免费看的黄色大片| 日韩伦理一区二区三区| 97国产精品免费视频| 天堂网av在线播放| 欧美日韩国产综合视频在线观看中文 | 99热超碰在线| 亚洲乱码久久| 欧美日本国产精品| www.一区| 精品国模在线视频| 91精品视频免费在线观看| 中文字幕一区在线| 在线观看免费看片| 亚洲二区在线| 欧美一区二区三区四区在线观看地址 | 精品久久久久久久久中文字幕| 欧美熟妇精品黑人巨大一二三区| 久久av最新网址| 亚洲精品久久区二区三区蜜桃臀| 激情久久一区二区| 欧美日本啪啪无遮挡网站| 丰满人妻一区二区三区无码av| 婷婷国产在线综合| 亚洲精品视频网址| 国产精品小仙女| 日韩欧美一区二| 奇米影视亚洲| 国产日韩欧美综合精品| 欧亚一区二区| 欧美成人午夜剧场免费观看| 午夜在线视频免费| 欧美主播一区二区三区| 农村妇女精品一区二区| 99视频一区二区三区| 一区二区三区网址| 亚洲电影在线| 在线国产99| 日韩一级电影| 亚洲japanese制服美女| 樱花草涩涩www在线播放| 久久精品国产99国产精品澳门 | 亚洲视频免费一区| a在线观看视频| 色偷偷成人一区二区三区91| 成年人一级黄色片| 久久亚洲春色中文字幕久久久| 国产九九热视频| 午夜综合激情| 800av在线免费观看| 欧美偷拍自拍| 久久久久久久久久码影片| www一区二区三区| 欧美综合一区第一页| 性欧美高清come| 中文字幕亚洲天堂| 瑟瑟在线观看| 亚洲国产日韩欧美综合久久| 国产强被迫伦姧在线观看无码| 一本色道a无线码一区v| 久久香蕉精品视频| 亚洲三级在线免费观看| 成年人在线免费看片| www成人在线观看| 91视频在线免费| 国产成人免费视频一区| 国内自拍第二页| 日本成人超碰在线观看| 欧美韩国日本在线| 中国成人一区| 可以免费看的黄色网址| 日韩在线第七页| 午夜免费电影一区在线观看| 尤物tv在线精品| 精品一区久久| 欧美日韩大片免费观看| 精品国产乱码久久久久| 97视频一区| 超碰97在线资源| 最新国产精品精品视频| 91手机在线播放| 日韩中文字幕在线一区| 91中文字幕在线观看| 综合欧美精品| 91在线观看免费网站| 国产成年精品| 亚洲综合日韩在线| 综合久久av| 91网站在线免费观看| 欧美xxxx网站| 国产精品夜色7777狼人| 欧美成人高清视频在线观看| 国产精品成人免费电影| 1024在线播放| 欧美极品在线视频| 牛牛精品在线| 欧美久久精品午夜青青大伊人| 免费不卡av| 欧美国产日本高清在线| dy888亚洲精品一区二区三区| 操91在线视频| 国产一区久久精品| 超在线视频97| 国产理论电影在线| 亚州av一区二区| 成人免费观看在线观看| 日本精品免费一区二区三区| 超碰一区二区| 国产成人精品a视频一区www| 久久亚洲人体| 91在线观看免费观看 | 成年人在线免费看片| 国产精品福利影院| 一级黄色录像视频| 欧美日韩免费看| 国产精品国产精品国产| 欧美一卡二卡三卡| 天堂中文在线看| 揄拍成人国产精品视频| 在线中文资源天堂| 久久99精品国产99久久6尤物| 黑人精品视频| 91高清视频免费| 欧美成人三级| 97人人干人人| 亚洲一区网址| 欧美日韩精品免费观看| 久久视频在线| 亚洲av首页在线| 亚洲永久视频| 亚洲小视频网站| 精品一区在线看| 日本人妻一区二区三区| ww久久中文字幕| 免费一级片视频| 日韩欧美在线观看| 中文在线字幕免费观| 精品精品欲导航| 风间由美一区| 欧美另类极品videosbest最新版本| 成人线上视频| 91香蕉亚洲精品| 日韩av字幕| 欧洲美女和动交zoz0z| 日韩视频一区| www.久久av.com| 久久理论电影网| 九九热国产在线| 午夜激情久久久| 国产视频www| 亚洲免费av片| 91插插插插插插插插| 6080成人| 神马欧美一区二区| 亚洲精品影视| 尤物国产在线观看| 91丝袜高跟美女视频| 久艹视频在线观看| 欧美性一二三区| 天天色综合av| 久久青草精品视频免费观看| 久久久久黄色| yy111111少妇影院日韩夜片| 久久综合88| 国产精品视频一区二区三区四区五区| 国产一区二区在线观看免费| 免费看污片网站| 亚洲国产精品一区二区久久 | 69堂成人精品免费视频| 亚洲色大成网站www| 日韩一区二区av| 成人欧美一区二区三区的电影| av色综合网| 欧美aa国产视频| 欧美黄色性生活| 97久久超碰国产精品| 国产一级做a爱免费视频| 欧美日韩精品一区二区三区四区 | 日本高清不卡码| 欧美精品一区二区高清在线观看 | 国产精品一色哟哟| 久久丁香综合五月国产三级网站| avtt香蕉久久| 亚洲国产美女搞黄色| 精品区在线观看| 欧美成人全部免费| 日本高清精品| 最近2019中文字幕一页二页 | 亚洲无码精品在线播放| 亚洲天堂男人天堂女人天堂| 91桃色在线| 成人免费视频网站| 亚洲视频精品| 国产sm在线观看| 1区2区3区精品视频| 国产农村妇女毛片精品久久| 日韩一区视频在线| 亚洲精品乱码日韩| 天堂社区 天堂综合网 天堂资源最新版 | 亚洲精品98久久久久久中文字幕| 婷婷在线播放| 国产不卡一区二区三区在线观看| 在线观看一区视频| yjizz视频| 色狠狠色狠狠综合| 国产中文在线视频| 国产精品激情av电影在线观看 | 成人国产视频在线观看| 久草精品视频在线观看| 精品国内二区三区| 久草成色在线| 欧美不卡在线一区二区三区| 欧美亚洲一区二区三区| 国产精品理论在线| 欧美挠脚心视频网站| xvideos国产在线视频| 国产欧美一区二区在线播放| 国产亚洲精品v| 蜜桃av乱码一区二区三区| 欧美日韩精品欧美日韩精品一综合| 视频免费一区| 国产精品有限公司| 国产视频亚洲| fc2成人免费视频| 欧美亚洲综合网| 97caopron在线视频| 久久久久久高清| 日本 国产 欧美色综合| 男人在线观看视频| 亚洲国产欧美精品| 日本综合字幕| 免费成人进口网站| a在线欧美一区| 最近日韩免费视频| 欧美高清第一页| 欧美日韩破处| 亚洲精品综合在线观看| 亚洲成人免费看| 免费看美女视频在线网站| 成人av免费看| 石原莉奈在线亚洲三区| 精品无码人妻一区二区三|