深入探究 Linux Out of Memory

一、內存泄漏

內存泄漏是指程序在申請內存後,使用完畢後沒有正確歸還給系統,導致該內存一直佔據着系統的內存資源,直至系統資源被耗盡。內存泄露是導致 Out of Memory 的一個主要原因

舉個例子,當一個內存分配的應用程序申請一塊內存,如果在代碼中無法找到釋放該內存的代碼塊,則該塊內存將一直佔用內存並不釋放,最終導致系統內存不足。

char *str;
while(1){
    str = (char*)malloc(1024); //申請1KB內存
    printf("Allocating 1 KB... \n");
}

二、內存資源的限制

內存是有限的,不可能越來越大,因此在Linux中資源限制是必須的。在內核中有以下幾種內存資源限制:

1. RLIMIT_STACK: 進程棧空間的限制

2. RLIMIT_CORE: Core文件大小的限制

3. RLIMIT_DATA: 數據段的限制

4. RLIMIT_FSIZE: 文件大小的限制

如果進程超過了資源限制,內核將向該進程發送一個.SIGXCPU 信號通知進程超過了資源限制。

三、OOM Killer

當系統內存使用超出可用範圍時,內核必須通過停止其中一個或多個進程來釋放內存,並且選擇將哪個進程停止。此時會觸發 OOM Killer。

OOM Killer 會在操作系統內核發現內存不足時自動運行,根據系統內部的算法找到佔用內存資源最多的進程,並強制殺死該進程。其優先級低於Kswapd,但優先級比任何其他代碼都高

四、Kswapd

Kswapd是Kernel Swap Daemon的簡稱,是Linux內核內存管理機制的重要組成部分。它的主要工作是監控操作系統對存儲器的使用,當發現內存過度使用或存在大量等待空閑內存的進程時,就會觸發Swap機制,將不常用的頁調出物理內存並寫入硬盤上swap分區中,從而獲得額外的內存空間來存放正在運行的進程需要的數據。

它主要分為兩種狀態:

1. Kswapd0: 負責回收匿名內存(代價較大,優先級低)

2. Kswapd1: 負責回收頁面緩存(代價較小,優先級高)

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

int main(int argc,char* argv[]){
    char* buffer = NULL;
    int buffer_size = atoi(argv[1]);
    memset(buffer, '0', buffer_size);
    sleep(60);
    return 0;
}

五、解決方案

避免 Out of Memory 的一個有效辦法是利用 Swap 空間。Swap 是指硬盤上留出的一部分空間,用來存放內存中暫時不使用的數據。當物理內存不足時就可將暫時不使用內存存放到 Swap 空間中,騰出物理內存,以保證系統正常運行。但是,如果過多使用 Swap 空間,也會導致系統性能下降。

除 Swap 外,還有以下一些解決方案:

1. 調整應用進程所佔內存空間大小,減少內存消耗(需要在進程佔用內存空間過大時及時進行升級)

2. 合理使用內存,注意申請/釋放內存資源追蹤問題

3. 部署內存監控機制,實時監控內存消耗狀況

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/206882.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-08 14:18
下一篇 2024-12-08 14:18

相關推薦

  • eslint no-loss-of-precision requires at least eslint v7.1.0

    這篇文章將從以下幾個方面詳細闡述eslint no-loss-of-precision requires至少需要eslint v7.1.0版本的問題: 一、概述 如果使用較老的es…

    編程 2025-04-29
  • 如何在Linux中添加用戶並修改配置文件

    本文將從多個方面詳細介紹在Linux系統下如何添加新用戶並修改配置文件 一、添加新用戶 在Linux系統下創建新用戶非常簡單,只需使用adduser命令即可。使用以下命令添加新用戶…

    編程 2025-04-27
  • 如何解決linux jar包 invalid or corrupt jarfile問題

    對於許多開發人員和系統管理員在Linux環境下使用Java開發過程中遇到的一個常見的問題是 invalid or corrupt jarfile(無效或損壞的jar文件)錯誤。當您…

    編程 2025-04-27
  • 在Linux上安裝JRE並配置環境變量

    本文將從以下幾個方面為您詳細闡述如何在Linux系統上,通過自己賬戶安裝JRE,並且配置環境變量。 一、安裝JRE 在進行安裝前,我們需要下載JRE的安裝包並解壓,可以從官方網站下…

    編程 2025-04-27
  • GTKAM:Linux下的照片管理器

    GTKAM是用於Linux操作系統的一款照片管理器,它支持多種相機及存儲設備,並提供了一系列強大的工具,讓用戶可以方便地瀏覽、管理、編輯和導出照片。本文將從多個方面對GTKAM進行…

    編程 2025-04-27
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁盤中。在執行sync之前,所有的文件系統更新將不會立即寫入磁盤,而是先緩存在內存…

    編程 2025-04-25
  • Linux修改文件名命令詳解

    在Linux系統中,修改文件名是一個很常見的操作。Linux提供了多種方式來修改文件名,這篇文章將介紹Linux修改文件名的詳細操作。 一、mv命令 mv命令是Linux下的常用命…

    編程 2025-04-25
  • 深入解析Vue3 defineExpose

    Vue 3在開發過程中引入了新的API `defineExpose`。在以前的版本中,我們經常使用 `$attrs` 和` $listeners` 實現父組件與子組件之間的通信,但…

    編程 2025-04-25
  • 深入理解byte轉int

    一、位元組與比特 在討論byte轉int之前,我們需要了解位元組和比特的概念。位元組是計算機存儲單位的一種,通常表示8個比特(bit),即1位元組=8比特。比特是計算機中最小的數據單位,是…

    編程 2025-04-25
  • List of Devices Attached是什麼意思

    一、介紹 在Android應用程序開發中,List of Devices Attached這個術語是非常常見的。它的簡稱是LoDA,大多數情況下,我們可以看到這個縮寫在Androi…

    編程 2025-04-25

發表回復

登錄後才能評論