kxbin
          成功留給有準備的人
          posts - 10,  comments - 35,  trackbacks - 0
          內(nèi)存是Linux內(nèi)核所管理的最重要的資源之一。
          內(nèi)存管理系統(tǒng)是操作系統(tǒng)中 最為重要的部分,因為系統(tǒng)的物理內(nèi)存總是少于系統(tǒng)所需要的內(nèi)存數(shù)量。虛擬內(nèi)存就是為了克服這個矛盾而采用的策略。系統(tǒng)的虛擬內(nèi)存通過在各個進程之間共享內(nèi) 存而使系統(tǒng)看起來有多于實際內(nèi)存的內(nèi)存容量。
          Linux支持虛擬內(nèi)存, 就是使用磁盤作為RAM的擴展,使可用內(nèi)存相應(yīng)地有效擴大。核心把當前不用的內(nèi)存塊存到硬盤,騰出內(nèi)存給其他目的。當原來的內(nèi)容又要使用時,再讀回內(nèi)存。

          一、內(nèi)存使用情況監(jiān)測

            (1)實時監(jiān)控內(nèi)存使用情況

            在命令行使用“Free”命令可以監(jiān)控內(nèi)存使用情況

          #free 

          --------------------------------------------------------------------------------------------------------

          total       used       free     shared    buffers     cached
          Mem:       8161244    8143540      17704          0       2364     862404
          -/+ buffers/cache:    7278772     882472
          Swap:      1020088    1014332       5756
          --------------------------------------------------------------------------------------------------------

            上面給出了一個256兆的RAM和512兆交換空間的 系統(tǒng)情況。第三行輸出(Mem:)顯示物理內(nèi)存。total列不顯示核心使用的物理內(nèi)存(通常大約1MB)。used列顯示被使用的內(nèi)存總額(第二行不計 緩沖)。 free列顯示全部沒使用的內(nèi)存。Shared列顯示多個進程共享的內(nèi)存總額。Buffers列顯示磁盤緩存的當前大小。第五行(Swap:)對對換空 間,顯示的信息類似上面。如果這行為全0,那么沒使用對換空間。在缺省的狀態(tài)下,free命令以千字節(jié)(也就是1024字節(jié)為單位)來顯示內(nèi)存使用情況。 可以使用?h參數(shù)以字節(jié)為單位顯示內(nèi)存使用情況,或者可以使用?m參數(shù)以兆字節(jié)為單位顯示內(nèi)存使用情況。還可以通過?s參數(shù)使用命令來不間斷地監(jiān)視內(nèi)存使 用情況:

            #free -b -s2

            這個命令將會在終端窗口中連續(xù)不斷地報告內(nèi)存的使用情況,-b:單位為bytes,-s2:每2秒鐘更新一次。

            (2)組合watch  free命令用來實時監(jiān)控內(nèi)存使用情況:

          #watch -n 2 -d free

          --------------------------------------------------------------------------------------------------------

          Every 2.0s: free                                                                                            Fri Nov 20 10:34:39 2009

          total       used       free     shared    buffers     cached
          Mem:       8161244    8143412      17832          0       2364     861928
          -/+ buffers/cache:    7279120     882124
          Swap:      1020088    1014332       5756

          --------------------------------------------------------------------------------------------------------

            watch命令會每兩秒執(zhí)行 free一次,執(zhí)行前會清除屏幕,在同樣位置顯示數(shù)據(jù)。因為 watch命令不會卷動屏幕,所以適合出長時間的監(jiān)測內(nèi)存使用率。可以使用 -n選項,控制執(zhí)行的頻率;也可以利用 -d選項,讓命令將每次不同的地方顯示出來。Watch命令會一直執(zhí)行,直到您按下 [Ctrl]-[C] 為止。

          二、虛擬內(nèi)存的概念

            (1)Linux虛擬內(nèi)存實現(xiàn)機制

            Linux虛擬內(nèi)存的實現(xiàn)需要六種機制的支持:地址映射機制、內(nèi)存分配回收機制、緩存和刷新機制、請求頁機制、交換機制、內(nèi)存共享機制。

            首先內(nèi)存管理程序通過映射機制把用戶程序的邏輯地址映射到物理地址,在用戶程序運行時如果發(fā)現(xiàn)程序中要用的虛地址沒有對應(yīng)的物理內(nèi)存時,就發(fā)出 了請求頁要求;如果有空閑的內(nèi)存可供分配,就請求分配內(nèi)存(于是用到了內(nèi)存的分配和回收),并把正在使用的物理頁記錄在緩存中(使用了緩存機制)。 如果沒有足夠的內(nèi)存可供分配,那么就調(diào)用交換機制,騰出一部分內(nèi)存。另外在地址映射中要通過TLB(翻譯后援存儲器)來尋找物理頁;交換機制中也要用到交 換緩存,并且把物理頁內(nèi)容交換到交換文件中后也要修改頁表來映射文件地址。

            (2)虛擬內(nèi)存容量設(shè)定

            也許有人告訴你,應(yīng)該分配2倍于物理內(nèi)存的虛擬內(nèi)存,但這是個不固定的規(guī)律。如果你的物理保存比較小,可以這樣設(shè)定。如果你有1G物理內(nèi)存或更 多的話,可以縮小一下虛擬內(nèi)存。Linux會把大量的內(nèi)存用做Cache的,但在資源緊張時回收回.。你只要看到swap為0或者很小就可以放心了,因為 內(nèi)存放著不用才是最大的浪費。

          三、使甩vmstat命令監(jiān)視虛擬內(nèi)存使用情況

            vmstat是Virtual Meomory Statistics(虛擬內(nèi)存統(tǒng)計)的縮寫,可對操作系統(tǒng)的虛擬內(nèi)存、進程、CPU活動進行監(jiān)視。它是對系統(tǒng)的整體情況進行統(tǒng)計,不足之處是無法對某個進程進行深入分析。通常使用vmstat 1 10(表示每1秒刷一次,共刷10次)命令測試。將得到一個數(shù)據(jù)匯總它可以反映真正的系統(tǒng)情況。

          #vmstat 1 10 

          --------------------------------------------------------------------------------------------------------

          procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
          r  b   swpd   free   buff  cache   si   so    bi    bo   in    cs us sy id wa
          0  0 1014332  18800   2364 861248    0    0    48    72    0     0  1  0 98  1
          0  0 1014332  18800   2364 861248    0    0     0     0 1130  1134  0  0 100  0
          0  0 1014332  18800   2364 861248    0    0     0   128 1212  1158  0  0 100  0
          0  0 1014332  18800   2364 861248    0    0     0     0 1130  1104  0  0 100  0
          0  0 1014332  18800   2364 861248    0    0     0     0 1186  1104  0  0 100  0
          0  0 1014332  18840   2364 861248    0    0     0     0 1135  1101  1  0 99  0
          0  0 1014332  18840   2364 861248    0    0     0     0 1129  1039  0  0 100  0
          0  0 1014332  18848   2364 861248    0    0     0    44 1202  1055  0  0 100  0
          0  0 1014332  18848   2364 861248    0    0     0     0 1144  1090  0  0 100  0
          0  0 1014332  18880   2364 861248    0    0     0     0 1194  1134  1  0 99  0

          --------------------------------------------------------------------------------------------------------

            vmstat命令輸出分成六個部分:

            (1)進程procs:

            r:在運行隊列中等待的進程數(shù) 。

            b:在等待io的進程數(shù) 。

            (2)內(nèi)存memoy:

            swpd:現(xiàn)時可用的交換內(nèi)存(單位KB)。

            free:空閑的內(nèi)存(單位KB)。

            buff: 緩沖去中的內(nèi)存數(shù)(單位:KB)。

            cache:被用來做為高速緩存的內(nèi)存數(shù)(單位:KB)。

            (3) swap交換頁面

            si: 從磁盤交換到內(nèi)存的交換頁數(shù)量,單位:KB/秒。

            so: 從內(nèi)存交換到磁盤的交換頁數(shù)量,單位:KB/秒。

            (4) io塊設(shè)備:

            bi: 發(fā)送到塊設(shè)備的塊數(shù),單位:塊/秒。

            bo: 從塊設(shè)備接收到的塊數(shù),單位:塊/秒。

            (5)system系統(tǒng):

            in: 每秒的中斷數(shù),包括時鐘中斷。

            cs: 每秒的環(huán)境(上下文)切換次數(shù)。

            (6)cpu中央處理器:

            cs:用戶進程使用的時間 。以百分比表示。

            sy:系統(tǒng)進程使用的時間。 以百分比表示。

            id:中央處理器的空閑時間 。以百分比表示。

            如果 r經(jīng)常大于 4 ,且id經(jīng)常小于40,表示中央處理器的負荷很重。 如果bi,bo 長期不等于0,表示物理內(nèi)存容量太小。

          四、Linux 服務(wù)器的內(nèi)存泄露和回收內(nèi)存的方法

            1、內(nèi)存泄漏的定義:

            一般我們常說的內(nèi)存泄漏是指堆內(nèi)存的泄漏。堆內(nèi)存是指程序從堆中分配的,大小任意的(內(nèi)存塊的大小可以在程序運行期決定),使用完后必須顯示釋放的內(nèi)存。應(yīng)用程序一般使用malloc,realloc,new等函數(shù)從堆中分配到一塊內(nèi)存,使用完后,程序必須負責(zé)相應(yīng)的調(diào)用free或delete釋放該內(nèi)存塊,否則,這塊內(nèi)存就不能被再次使用,我們就說這塊內(nèi)存泄漏了。

            2、內(nèi)存泄露的危害

            從用戶使用程序的角度來看,內(nèi)存泄漏本身不會產(chǎn)生什么危害,作為一般的用戶,根本感覺不到內(nèi)存泄漏的存在。真正有危害的是內(nèi)存泄漏的堆積,這會 最終消耗盡系統(tǒng)所有的內(nèi)存。從這個角度來說,一次性內(nèi)存泄漏并沒有什么危害,因為它不會堆積,而隱式內(nèi)存泄漏危害性則非常大,因為較之于常發(fā)性和偶發(fā)性內(nèi) 存泄漏它更難被檢測到。存在內(nèi)存泄漏問題的程序除了會占用更多的內(nèi)存外,還會使程序的性能急劇下降。對于服務(wù)器而言,如果出現(xiàn)這種情況,即使系統(tǒng)不崩潰, 也會嚴重影響使用。

            3、內(nèi)存泄露的檢測和回收

            對于內(nèi)存溢出之類的麻煩可能大家在編寫指針比較多的復(fù)雜的程序的時候就會遇到。在 Linux 或者 unix 下,C、C++語言是最使用工具。但是我們的 C++ 程序缺乏相應(yīng)的手段來檢測內(nèi)存信息,而只能使用 top 指令觀察進程的動態(tài)內(nèi)存總額。而且程序退出時,我們無法獲知任何內(nèi)存泄漏信息。

            使用kill命令

            使用Linux命令回收內(nèi)存,我們可以使用Ps、Kill兩個命令檢測內(nèi)存使用情況和進行回收。在使用超級用戶權(quán)限時使用命令“Ps”,它會列出所有正在運行的程序名稱,和對應(yīng)的進程號(PID)。Kill命令的工作原理是:向Linux操作系統(tǒng)的內(nèi)核送出一個系統(tǒng)操作信號和程序的進程號(PID)。

            應(yīng)用例子:

            為了高效率回收內(nèi)存可以使用命令ps 參數(shù)v:

          [root@www ~]# ps v 

          --------------------------------------------------------------------------------------------------------

           PID TTY      STAT   TIME  MAJFL   TRS   DRS  RSS %MEM COMMAND
          11514 pts/14   Ss     0:00      0   679 54456   40  0.0 /bin/bash
          9898 pts/14   S+     0:00      0  2377 67094   56  0.0 vim diff.txt
          26007 pts/6    Ss+    0:00      2   679 54452  580  0.0 -bash
          6217 pts/8    Ss     0:00      0   679 54324 1020  0.0 -bash
          17900 pts/3    Ss     0:00      0   679 54316  564  0.0 -bash

          -------------------------------------------------------------------------------------------------------- 

          然后如果想回收vim命令的內(nèi)存的話,使用命令:

            # Kill -9 9898

            使用工具軟件

            Memprof是一個非常具有吸引力且非常易于使用的軟件,它由Red Hat的Owen Talyor創(chuàng)立。這個工具是用于GNOME前端的Boehm-Demers-Weiser垃圾回收器。這個工具直接就可以執(zhí)行,并且其工作起來無需對源代碼進行任何修改。在程序執(zhí)行時,這個工具會以圖形化的方式顯示內(nèi)存的使用情況。

          部分摘自:http://www.chinaz.com/Server/Linux/0926393Q2008.html

          posted on 2012-07-03 22:24 kxbin 閱讀(821) 評論(0)  編輯  收藏 所屬分類: 轉(zhuǎn)發(fā)Linux
          你恨一個人是因為你愛他;你喜歡一個人,是因為他身上有你沒有的;你討厭一個人是因為他身上有你有的東西;你經(jīng)常在別人面前批評某人,其實潛意識中是想接近他。

          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          常用鏈接

          留言簿(5)

          隨筆檔案

          文章分類

          文章檔案

          相冊

          收藏夾

          J2EE

          java技術(shù)網(wǎng)站

          Linux

          平時常去的網(wǎng)站

          數(shù)據(jù)庫

          電影網(wǎng)站

          網(wǎng)站設(shè)計

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 巴中市| 尉氏县| 韶山市| 晋中市| 礼泉县| 信宜市| 江阴市| 茂名市| 雷波县| 大石桥市| 江陵县| 临洮县| 顺义区| 海安县| 开化县| 清新县| 佛冈县| 普安县| 合江县| 永城市| 桂东县| 浦东新区| 樟树市| 漾濞| 六枝特区| 洪湖市| 元氏县| 应用必备| 义马市| 伊金霍洛旗| 天水市| 阆中市| 香河县| 莱芜市| 乌兰察布市| 都昌县| 兴文县| 喜德县| 宁南县| 五华县| 水富县|