1. 程式人生 > >Linux是這樣洩露記憶體的:Linux記憶體洩露過程觀察

Linux是這樣洩露記憶體的:Linux記憶體洩露過程觀察

今天寫了一個記憶體洩露程式,觀察系統記憶體的變化情況。

測試環境為:

[email protected]:/home/test# cat /etc/issue

Ubuntu 12.04 LTS \n \l

一、記憶體洩露程式碼

程式碼如下:

MemoryLeak.h


#ifndef MEMORYLEAK_H
#defineMEMORYLEAK_H


#include <iostream>  
#include <unistd.h>  //sleep

class MemoryLeak {
public:
    MemoryLeak();
    MemoryLeak(const MemoryLeak& orig);
    int testLeak(const int block, const int count);
    virtual ~MemoryLeak();
private:

};

#endif/* MEMORYLEAK_H */

MemoryLeak.cpp檔案

#include "MemoryLeak.h"

MemoryLeak::MemoryLeak() {
}

MemoryLeak::MemoryLeak(const MemoryLeak& orig) {
}

/*

*testLeak函式

*引數block表示每次洩露的記憶體塊大小,引數count 表示一共洩露多少次

*/

int MemoryLeak::testLeak(const int block, const int count){

    int *p = 0;
    long sum = 0;
    for(int i=0; i<count; i++){
        p = new int [block];

       //注意:一定要賦值,否則沒有真正分配記憶體,而Java只要new後,就分記憶體,無需賦值。
        for (int i=0; i<block; i++) {
            p[i] = 1;
        }
        
        //std::cout<<sizeof(p)<<std::endl;
        sum += 4*block;
        std::cout<<"Allocated Memory is " << sum/(1024*1024)<<" MB" <<std::endl;
        sleep(3);
    }

MemoryLeak::~MemoryLeak() {
}

//如果忘了寫解構函式,在編譯時就會丟擲如下錯誤:

MemoryLeak.cpp:(.text+0x29): undefined reference to `vtable for MemoryLeak'

int main(int argc, char** argv) {
    
    MemoryLeak *memoryLeak = new MemoryLeak();
    memoryLeak->testLeak(10*1024*1024,100);  //引數可以改

    return 0;
}

上述程式碼每3秒,洩露40MB記憶體

二、監控

1、洩露程序監控

可以使用下列指令碼檢視改程序引起的記憶體變化:

#!/bin/bash
while [ 1 ]
do
cat /proc/1693/status |grep VmRSS  >> /tmp/1693perf
sleep 3
done

nohup ./1693perf  2>&1  &

其中,1693為記憶體洩露程式碼的程序號

2、系統整體狀況監測

用下列命令觀察系統記憶體變化過程

[email protected]:/home/zhxue# vmstat  2 -S MB

procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 2  0      0    136    148    948    0    0     0     0  394 1581 55 46  0  0
 1  0      0    136    148    949    0    0    10     0  294 1299 18 32 50  0
 2  0      0    147    128    917    0    0     0    30  427 1442 28 58 15  0
 1  0      0    147    128    917    0    0     0     0  278 1257 15 31 53  0
 0  0      0    138    116    898    0    0     0    14  341 1261 29 48 23  0
 0  0      0    138    116    898    0    0     0     8  298 1268 21 35 45  0
 3  0      0    132    104    877    0    0     0   106  370 1194 31 60  9  0
 1  0      0    144    100    870    0    0     0    38  311 1225 26 44 30  0
 0  0      0    136     87    850    0    0     0     6  353 1349 38 50 12  0
 0  0      0    136     87    850    0    0     0     4  276 1267 16 29 54  0
 3  0      0    143     83    808    0    0     0     0  352 1420 30 49 21  0
 3  0      0    143     83    808    0    0     0    20  283 1332 16 33 52  0
 2  0      0    136     83    776    0    0     0   202  367 1423 26 45 29  0
 3  0      0    120     83    776    0    0     0     0  297 1287 21 35 44  0
 0  0      0    136     80    739    0    0     0    26  329 1366 23 40 37  0
 7  0      0    116     80    732    0    0     0     8  322 1307 26 38 37  0
 2  0      0    138     77    700    0    0     0    26  318 1247 22 36 42  0
 2  0      0    131     74    671    0    0     0    28  332 1253 26 41 34  0
 0  0      0    134     74    667    0    0     0     0  305 1293 20 36 45  0
 1  0      0    133     74    629    0    0     0    14  349 1384 28 42 30  0
 0  0      0    133     74    629    0    0     0     8  302 1274 17 33 51  0
 1  0      0    136     74    587    0    0     0     0  344 1335 30 46 25  0
 1  0      0    135     74    587    0    0     0     0  285 1251 16 29 55  0
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 1  0      0    157     74    526    0    0     0     6  346 1322 29 44 27  0
 5  0      0    157     74    526    0    0     0    32  279 1291 19 30 51  0
14  0      0    117     74    526    0    0     0     0  338 1306 26 44 30  0
 3  0      0    125     74    505    0    0     0    12  327 1361 27 40 32  1
 0  0      0    147     74    456    0    0     0     4  332 1224 24 46 30  0
 3  0      0    134     74    456    0    0     0     0  310 1292 18 36 46  0
 0  0      0    136     73    428    0    0     0     6  323 1345 22 41 36  1
 3  0      0    132     71    404    0    0     0     0  311 1253 26 35 39  0
 1  0      0    139     70    389    0    0    40     4  313 1358 21 37 42  0
 0  0      0    152     67    340    0    0     0    14  345 1362 27 42 30  0
 0  0      0    151     67    340    0    0     0     0  296 1247 17 30 53  0
 1  0      0    141     60    319    0    0     2   144  379 1366 31 43 27  0
 0  0      0    141     60    319    0    0     0     6  299 1275 17 31 52  0
 2  0      0    144     43    294    0    0     0     6  343 1434 23 46 32  0
 1  0      0    144     43    294    0    0     0     0  288 1318 17 32 51  0
 0  0      0    141     29    273    0    0     0     8  344 1285 31 49 20  0
 0  0      0    141     29    273    0    0     0     0  284 1273 13 33 54  0
 3  0      0    144     17    243    0    0     0    28  353 1408 27 52 22  0
 2  0      0    138     17    243    0    0    70    20  306 1313 16 37 47  0
 0  0      1    140      4    222    0    0     0    42  340 1446 26 48 26  0
 2  0      1    119      4    222    0    0     0     0  300 1348 21 37 42  0
 1  0      1    145      1    184    0    0     0   104  337 1342 25 45 30  0
 3  0      1    112      1    184    0    0   200    18  359 1285 22 42 36  0
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 1  0      1    140      0    152    0    0   128   278  356 1424 20 52 27  0
 3  0      1    109      0    148    0    0     0    22  313 1203 27 42 32  0
 1  0      1    142      0    113    0    0     0    24  350 1239 26 64 10  0
 3  0      1    113      0    107    0    0  1688    20  336 1194 33 46 19  1
 0  0      8    135      0     89    0    0     0  3442  395 1355 22 51 26  1
 5  0     23    111      0     89    0    0     0  7588  394 1346 25 49 26  0
 1  0     38    130      0     87    0    0     0  7956  431 1335 16 50 34  0
 2  0     58    112      0     87    0    0     0 10218  409 1351 28 51 21  0
 0  0     74    129      0     86    0    0    70  7874  443 1362 17 50 32  0
 9  0     95    112      0     85    0    0     0 11046  432 1290 25 57 18  0
 0  0    110    129      0     84    0    0     0  7514  413 1373 19 46 34  1
 3  0    127    107      0     84    0    0    32  8470  416 1276 29 55 16  0
 2  0    147    129      0     84    0    0    46 10298  489 1452 25 62 13  0
 2  0    165    108      0     84    0    0     0  9322  433 1325 28 53 19  0
 1  0    184    129      0     82    0    0     0  9784  442 1403 19 49 32  0
 2  0    202    108      0     83    0    0   118  9200  460 1374 27 53 20  0
 0  0    221    129      0     81    0    0    16  9656  448 1397 18 52 30  1
 2  0    238    107      0     81    0    0     0  8712  448 1318 28 54 17  0
 1  0    258    128      0     80    0    0   360 10430  465 1402 20 55 25  1
 4  0    281    111      0     81    0    0   198 11986  503 1400 26 59 15  0
 0  0    296    127      0     80    0    0    32  7724  419 1384 21 48 31  0
 2  0    319    110      0     80    0    0    16 11286  496 1452 28 63  9  0
 2  0    336    128      0     79    0    0    48  9118  431 1422 20 48 32  0
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 4  0    359    111      0     79    0    0    32 11790  489 1332 35 57  8  0
 1  0    375    127      0     78    0    0    48  7844  424 1393 19 50 31  0
 4  0    399    111      0     78    0    0    50 12302  524 1469 29 61 10  0
 1  0    414    127      0     78    0    0    80  7880  405 1386 16 48 36  1
 4  0    441    114      0     78    0    0    96 13844  528 1393 27 63 10  0
 3  0    469    120      0     78    0    0 13668 15358  881 1534  9 79  4  8
 2  1    513     93      0     81    0    0 17136 22800 1022 1392 10 90  0  0
 1  0    554    116      0     77    0    0 15280 24968 1028 1420  2 97  0  1
 2  1    577     91      0     75    0    0  9468 16076  789 1276 21 78  0  1
 0  0    605    120      0     73    0    0   224 14214  503 1421 17 62 21  0
 3  0    619     94      0     74    0    0   532  7508  436 1319 28 51 21  0
 2  0    644    120      0     73    0    0     0 12780  493 1429 22 61 17  0
 2  0    658     94      0     73    0    0    16  7236  433 1354 29 49 22  0
 0  0    683    120      0     72    0    0    16 12860  471 1454 21 55 24  0
 3  0    698     94      0     72    0    0     0  7326  427 1302 27 49 23  0
 1  0    709    120      0     71    0    0     8  5816  384 1374 18 44 38  0
 3  0    720    100      0     71    0    0    10  5488  409 1265 30 49 21  0
 0  0    734    121      0     70    0    0    24  7510  449 1468 22 52 26  1
 5  0    746    105      0     70    0    0    50  5858  429 1389 30 52 18  0
 5  0    754    121      0     69    0    0    90  4200  384 1385 18 43 38  1
 2  0    765     97      0     68    0    0   124  6152  433 1318 31 55 14  0
 2  0    789    121      0     66    0    0   172 12076  492 1408 22 61 16  0
 5  1    800     90      0     68    0    0   754  5866  442 1360 30 53 16  1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 3  0    825    116      0     66    0    0   268 13206  512 1448 16 61 22  1
 4  0    840     91      0     66    0    0   292  7806  465 1372 24 56 19  0
 1  0    865    116      0     66    0    0   268 12890  505 1422 18 58 23  1
 2  0    880     91      0     66    0    0   224  7612  436 1313 26 54 20  1
 1  0    905    116      0     65    0    0   102 13050  507 1453 21 60 19  0
 4  0    920     91      0     65    0    0   232  7916  467 1404 26 56 18  0
 3  0    944    116      0     65    0    0   172 12662  504 1438 20 59 20  1
 2  0    957     88      0     65    0    0   190  6546  430 1288 29 50 20  1
 2  0    984    113      0     66    0    0  2236 14190  648 1519 22 77  1  1
 4  0    998     87      0     68    0    0  2744  7588  568 1634 36 62  2  0
 1  0   1031    116      0     66    0    0   254 17140  567 1477 21 72  8  0
 3  0   1036     92      0     66    0    0   132  2756  363 1307 23 44 34  0
 0  0   1072    116      0     66    0    0   936 18542  620 1520 19 78  3  0
 5  0   1076     94      0     70    0    0  4566  2534  435 1422 21 47 32  1
 2  0   1109    111      0     69    0    0   242 16954  584 1458 25 75  0  0
 3  0   1116     99      0     68    0    0   144  3626  376 1357 22 41 37  0
 3  0   1151    115      0     68    0    0   172 18396  598 1553 28 72  0  0
 3  0   1154     99      0     68    0    0  6648  2568  645 1594 24 61 13  2
 2  0   1191    111      0     68    0    0   160 18964  624 1519 23 77  0  0
 4  0   1204    116      0     68    0    0  2304  6836  539 1330 19 58 22  0
 4  0   1234    113      0     68    0    0   166 15636  696 1445 27 74  0  0
 2  0   1254    132      0     67    0    0   160 10076  627 1479 23 69  8  0
 1  0   1277    121      1     67    0    0   150 12340  668 1457 31 69  0  0
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 3  0   1300    136      1     66    0    0   666 11798  637 1444 20 62 18  0
 2  0   1323    129      0     65    0    0   162 12066  602 1267 26 74  0  0
 3  0   1328    110      0     65    0    0   122  2684  387 1368 23 43 34  0
 3  0   1364    130      0     65    0    0   152 18354  742 1573 22 78  0  0
 5  0   1368    106      0     65    0    0    94  2280  380 1269 23 44 33  0
 6  0   1400    127      0     65    0    0    86 16698  719 1443 24 76  0  0
 6  1   1407    120      0     66    0    0  1864  3954  482 1220 31 57 13  0
 3  0   1425    109      0     67    0    0   952  9872  481 1102 28 72  0  0
 0  0   1440    125      0     66    0    0    22  7700  433 1303 24 58 17  0
 2  0   1467    114      0     67    0    0   726 13810  567 1453 30 69  1  0
 0  0   1475    122      0     66    0    0   156  3996  378 1381 18 42 39  0
 2  0   1505    113      0     66    0    0    34 15876  568 1462 23 74  2  0
 1  0   1513    121      0     66    0    0   316  4064  385 1404 18 46 36  1
 4  1   1533    100      0     67    0    0   648 10458  502 1326 32 66  2  0
 0  0   1552    119      0     66    0    0   144  9718  468 1383 27 61 13  0
 4  0   1569     97      0     66    0    0   176  8978  478 1360 31 63  7  0
 3  0   1591    118      0     66    0    0   300 11296  500 1366 19 65 16  1
 4  0   1609     96      0     66    0    0   136  9220  470 1310 28 63  9  0
 1  0   1629    116      0     66    0    0   196 10432  465 1349 19 63 17  1
 3  0   1649     96      0     66    0    0   122 10332  480 1465 27 60 13  0
 0  0   1667    107      0     74    0    0  4602  9872  561 1490 18 66 16  0
 4  0   1684     88      0     72    0    0   104  8930  512 1198 27 61 12  1
 2  0   1713    118      0     68    0    0    32 14752  675 1449 20 80  0  0
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 3  0   1729     97      0     68    0    0     8  8416  573 1360 28 68  4  1
 4  0   1754    122      0     68    0    0   278 13164  629 1364 26 74  0  0
 4  0   1776    108      0     67    0    0    66 11214  650 1351 29 71  0  0
 1  0   1798    130      0     66    0    0   122 11542  616 1398 21 70 10  0
 3  0   1805     97      0     67    0    0    98  3444  419 1339 27 45 27  0
 0  0   1834    132      0     66    0    0   234 15356  771 1547 19 77  3  0
 5  0   1839     98      0     67    0    0  1652  2748  455 1391 25 52 23  0
 5  0   1872    129      0     67    0    0  2030 17098  720 1569 18 82  0  0
 3  0   1886    105      0     67    0    0   216  7476  565 1413 32 61  8  0
 0  0   1913    137      0     66    0    0   272 14258  772 1512 20 79  2  0
 3  0   1913    128      2     71    0    0  4034     0  644 1578 27 52 20  1
 5  0   1913    118      4     76    0    0  3606     0  613 1649 48 52  0  1
 2  0   1267   1184      5     76    0    0  1926     8  586 1392 28 72  0  0
 3  1    481   1676      6     80    0    0 11088     0  845 1436 19 74  0  7
 1  0    474   1644      6     85    0    0 16374    14 1013 1718 13 72  0 14
 1  0    471   1619      6     88    0    0 12704    20  889 1531 23 73  0  4
 0  0    471   1618      6     88    0    0   522    32  175  466  3  7 90  1
 1  0    471   1617      6     88    0    0    16     0  125  351  2  4 94  0
 0  0    471   1617      6     88    0    0     0    10  133  339  2  4 94  0
 0  0    471   1617      6     88    0    0     6     0  144  359  1  6 93  0
 0  0    471   1617      6     88    0    0     0     0  146  342  2  5 93  0
 4  0    471   1617      6     88    0    0    16     6  133  339  3  6 92  0
 0  0    471   1617      6     88    0    0     0     0  134  320  1  5 94  0

可以看到,整個過程中,Cache不斷下降,當它達到80MB左右時,系統啟動了swap,swap不斷上漲,當swap快到2G時(Swap的分割槽大小),程式丟擲如下錯誤並退出,系統的free記憶體重回到1.6GB(總共2GB記憶體)

terminate called after throwing an instance of 'std::bad_alloc'

  what():  std::bad_alloc

RUN FINISHED; Aborted; core dumped; real time: 5m 2s; user: 12s; system: 12s

檢視swap的大小:

[email protected]:/home/zhxue# swapon -s
FilenameType SizeUsed Priority
/dev/mapper/ubuntudev-swap_1            partition 2093052292520-1

http://blog.csdn.net/tianlesoftware/article/details/8741873

剛做完上次試驗後,再做了一次實驗:

[email protected]:/home/zhxue# vmstat  2 -S MB
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 2  0    281   1014     28    186    0    0    69    97  192  651  9 11 80  0
 1  0    281    981     28    186    0    0     0     0  302 1311 22 32 46  0
 0  0    281    941     28    186    0    0     0     0  305 1313 24 34 43  0
 1  0    281    901     28    186    0    0     0     8  310 1348 23 37 40  0
 1  0    281    861     28    186    0    0     0    14  306 1314 23 34 43  0
 3  0    281    850     28    186    0    0     0     0  295 1333 18 30 52  0
 0  0    281    821     28    186    0    0     0    20  312 1360 22 31 46  1
 0  0    281    781     28    186    0    0     0     0  312 1388 23 34 42  0
 0  0    281    741     28    186    0    0     0     0  318 1355 23 41 36  0
 2  0    281    704     28    186    0    0     0    82  327 1305 23 38 40  0
 0  0    281    701     28    186    0    0     0     0  278 1347 17 29 54  0
 0  0    281    660     28    186    0    0     0     0  311 1300 27 31 42  0
 0  0    281    620     28    186    0    0     0    16  304 1288 24 32 44  0
 0  0    281    580     28    186    0    0     0     0  307 1343 22 35 43  0
 1  0    281    540     28    186    0    0     0     8  317 1316 30 34 35  0
 2  0    281    530     28    186    0    0     0    22  304 1322 18 29 53  0
 1  0    281    500     28    186    0    0     0    48  323 1266 25 30 46  0
 0  0    281    460     28    186    0    0     0     0  318 1318 24 32 44  0
 0  0    281    420     28    186    0    0     0    10  328 1366 26 32 42  0
 1  0    281    380     28    186    0    0     0     0  318 1324 25 30 46  0
 1  0    281    340     28    186    0    0     0     0  311 1335 24 32 44  0
 3  0    281    331     28    186    0    0     0     6  298 1289 18 30 52  0
 1  0    281    300     28    186    0    0     0     0  311 1308 24 30 46  0
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 3  0    281    260     28    186    0    0     0     0  310 1355 26 32 42  0
 2  0    281    220     28    186    0    0     0    38  321 1327 25 32 43  0
 3  0    281    179     28    186    0    0     0     0  326 1378 26 32 42  0
 3  0    281    143     28    186    0    0     0     0  308 1298 21 32 46  0
 0  0    281    140     28    186    0    0     0     0  286 1329 15 28 56  0
 1  0    281    132     24    156    0    0     0     6  356 1435 24 48 27  0
 1  0    281    133     16    123    0    0     0     0  328 1389 24 42 34  0
 3  0    281    108     14    114    0    0     0     2  330 1337 23 39 38  0
 1  0    285    133     13     98    0    0     0  2264  456 1404 19 47 34  0
 0  0    288    130      8     67    0    0     0  1230  400 1426 24 47 29  0
 1  0    288    130      3     41    0    0     0   228  376 1427 20 54 25  0
 4  0    288    114      3     40    0    0     0     6  301 1297 22 32 46  0
 0  0    289    130      0     32    0    0   448   310  368 1479 20 54 27  0
 0  0    292    128      0     31    0    0   148  1572  364 1473 26 50 24  0
 4  0    302     98      0     31    0    0    38  5120  391 1429 25 45 30  1
 1  0    330    127      0     31    0    0    64 14728  513 1505 18 52 30  0
 4  0    369    125      0     31    0    0   564 19928  658 1550 24 77  0  0
 3  0    389    105      0     31    0    0    16 10272  461 1421 24 53 22  0
 6  0    413    106      0     35    0    0  2508 12076  570 1492 20 61 19  1
 2  1    454    125      0     34    0    0   948 20976  730 1558 24 76  0  0
 1  0    478    110      0     34    0    0     0 12606  553 1490 25 60 15  0
 4  1    499    108      0     35    0    0  1384 10708  629 1422 22 63 15  0
 4  1    522    108      0     39    0    0  4684 12364  617 1221 24 76  0  0
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 4  0    540     93      0     38    0    0     0  9016  478 1391 26 58 16  0
 1  0    571    120      0     37    0    0    40 16080  529 1467 16 61 23  0
 2  0    609    118      0     37    0    0     0 19406  604 1520 26 70  5  0
 2  0    627     95      0     37    0    0    16  8914  448 1448 24 50 26  0
 5  0    650    103      0     36    0    0     0 12024  466 1405 18 54 28  0
 3  0    691    118      0     37    0    0  2896 20862  701 1507 20 80  0  0
 4  0    713    101      0     37    0    0     0 11224  479 1456 24 57 19  0
 5  0    733     97      0     38    0    0  6300 11502  645 1508 23 63 10  3
 3  0    774    121      0     35    0    0    34 21394  749 1578 23 76  0  0
 4  0    791     98      0     33    0    0     0  8718  513 1350 25 55 20  0
 3  0    818    102      0     30    0    0    62 13854  698 1517 19 70 11  0
 3  0    854    121      0     29    0    0   252 18222  687 1663 25 75  1  0
 2  0    870     93      0     31    0    0  2614  8314  594 1537 23 63 14  0
 4  0    901    104      0     26    0    0     0 15794  706 1473 21 69 10  0
 1  0    937    122      0     26    0    0   158 18460  691 1512 20 72  8  1
 1  0    968    114      0     26    0    0     0 15888  556 1480 25 65 10  0
 4  0    983    102      0     26    0    0   180  8054  464 1306 21 56 24  0
 2  0   1014    121      0     25    0    0    32 15780  656 1444 24 76  0  0
 2  0   1043    116      0     25    0    0   174 15374  726 1508 23 75  2  0
 4  0   1062    107      0     25    0    0   146  9460  585 1453 23 64 12  0
 1  0   1096    128      0     25    0    0   154 17496  713 1453 21 79  0  0
 5  0   1124    117      0     25    0    0   134 14686  592 1434 28 72  0  0
 3  0   1136    109      0     24    0    0   116  6228  417 1397 24 50 26  0
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 1  0   1175    131      0     23    0    0   358 20094  755 1537 22 77  2  0
 3  0   1199    116      0     22    0    0   146 12780  532 1476 26 61 14  1
 3  0   1219    104      0     22    0    0    86  9946  584 1503 22 64 15  0
 1  0   1247    127      0     22    0    0   256 14688  596 1469 17 69 13  1
 2  0   1276    116      0     22    0    0   424 14754  569 1539 26 69  5  0
 4  0   1291    102      0     22    0    0   578  8292  508 1341 29 64  7  0
 1  0   1320    119      0     25    0    0  4558 14824  635 1529 21 72  7  0
 3  0   1339     95      0     29    0    0  2128 10224  517 1326 25 66  8  1
 5  0   1353     97      0     23    0    0   238  7394  499 1453 23 57 19  0
 0  0   1383    122      0     21    0    0   412 15086  787 1546 21 76  3  1
 3  0   1401    105      0     20    0    0   326  9420  583 1456 27 62 12  0
 3  0   1427    103      0     19    0    0   398 13790  729 1521 24 71  5  0
 1  0   1462    128      0     19    0    0   394 18198  677 1610 19 78  3  1
 1  0   1488    114      0     19    0    0   238 13420  620 1495 21 71  8  0
 5  0   1509     98      0     19    0    0   326 10842  663 1486 26 69  5  0
 0  0   1545    130      0     19    0    0   328 18366  783 1474 16 82  2  0
 3  0   1574    120      0     19    0    0   300 15042  684 1552 25 74  1  0
 2  0   1597    103      0     18    0    0   290 11964  669 1496 23 73  3  0
 6  0   1622    119      0     18    0    0   138 12884 1021 1387 20 80  0  0
 5  0   1633     96      0     18    0    0   750  6304 1245 1252 22 79  0  0
 4  0   1657     87      0     18    0    0   216 12268  922 1316 25 76  0  0
 1  0   1684    108      0     18    0    0   366 14780 1083 1279 17 84  0  0
 6  0   1706     90      0     19    0    0   576 11488  918 1446 27 74  0  0
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 4  0   1734    108      0     18    0    0   242 14646  840 1528 23 75  2  0
 4  0   1767    111      0     18    0    0   302 17184  692 1501 22 78  0  0
 7  0   1783     88      0     18    0    0   410  8566  583 1381 24 58 18  0
 0  0   1812    116      0     18    0    0   368 14806  785 1545 19 76  4  0
 2  0   1838    102      0     18    0    0   206 13634  782 1385 21 79  0  0
 2  0   1852    108      2     23    0    0  3874  7338  730 1518 24 66 10  1
 5  0   1853    103      4     22    0    0  3980   698  755 1647 38 62  0  1
 3  1   1864   1110      4     23    0    0  2374  6100  706 1452 24 77  0  0
 3  1    542   1783      5     27    0    0 14228     0  928 1763 14 76  0 10
 2  1    536   1741      5     34    0    0 21896    50 1077 1908 13 73  0 13
 0  0    533   1725      5     36    0    0  6890     0  539 1334 16 39 43  3
 0  0    533   1724      5     36    0    0     8     0  135  350  2  5 93  0

由於這次試驗是接著上次做的,系統已經幾乎沒有Cache了,所以,直接消耗free,當把free消耗到100MB左右,然後啟動swap,當swap達到1.8GB時,程式報錯同上。和上面一樣,到報錯為止,總共消耗了3GB記憶體

總結:

1. 如果沒做特殊的限制,Linux對記憶體的消耗是:先消耗Cache或Free,再消耗Swap,然後報錯退出,退出後把記憶體還回給Free,然後swap迴歸到某個值(這個值不是很大)。

三、在CGroup上的測試

CGroup的一些資訊請參考:http://blog.csdn.net/zhxue123/article/details/8945236

1、把記憶體設定為300MB的結果如下

[email protected]:/home/test/memleak# echo 300M >>  /sys/fs/cgroup/memory/zhxue/memory.memsw.limit_in_bytes 
[email protected]:/home/test/memleak# echo 300MB >>  /sys/fs/cgroup/memory/zhxue/memory.limit_in_bytes 
[email protected]:/home/test/memleak# cgexec -g memory:/zhxue ./memleak

[email protected]:/home/test# vmstat  3 -S M
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 1  0      3   3430     32    361    0    1     2     5    7    9  0  0 99  0
 0  0      3   3431     32    361    0    0     0     0   43   37  0  0 100  0
 0  0      3   3431     32    361    0    0     0     8   30   35  0  0 100  0
 0  0      3   3391     32    361    0    0     0     0   56   47  0  0 99  0
 0  0      3   3351     32    361    0    0     0     0   34   30  0  0 99  0
 0  0      3   3311     32    361    0    0     0     0   34   30  0  0 99  0
 0  0      3   3271     32    361    0    0     0     0   38   38  1  0 99  0
 0  0     37   3233     32    361    0 12911     0 12913  101   57  0  1 97  2
 0  0     88   3230     32    361    0 17327     0 17327   90   56  1  1 94  5
 0  0     92   3234     32    361    0 1332     0  1332   95   47  0  0 99  0
 0  1    144   3228     32    361    0 17811     0 17811   52   36  0  0 99  0
 0  0     56   3377     32    361    0 6124     0  6124  111   40  0  1 91  9
 0  0     56   3377     32    361    0    0     0     0   24   27  0  0 100  0
 0  0     56   3377     32    361    0    0     0     7   32   40  0  0 100  0
 0  0     56   3377     32    361    0    0     0     0   48   48  0  0 100  0
 0  0     56   3377     32    361    0    0     0     0   36   41  0  0 100  0
 0  0     56   3377     32    361    0    0     0     0   36   42  0  0 100  0

結論:當free消耗掉200M (2/3)記憶體時,swpd開始消耗,消耗了100M(1/3),程式被殺掉。

2、接著設定為2G結果如下:

[email protected]:/home/test# vmstat  3 -S M
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 1  0     56   3377     32    361    0    2     2     6    7    9  0  0 99  0
 0  0     56   3377     32    361    0    0     0     0  108   64  0  0 98  0
 0  0     56   3337     32    361    0    0     0     0   65   51  0  0 99  0
 0  0     56   3297     32    361    0    0     0     8   36   40  0  0 99  0
 0  0     56   3257     32    361    0    0     0     0   32   28  0  0 99  0
 0  0     56   3217     32    361    0    0     0     0   31   30  0  0 99  0
 0  0     56   3177     32    361    0    0     0     0   35   31  0  0 99  0
 0  0     56   3137     32    361    0    0     0     5   36   34  0  0 99  0
 0  0     56   3097     32    361    0    0     0     0   36   31  0  1 99  0
 1  0     56   3090     32    361    0    0     0     0   27   26  0  0 100  0
 0  0     56   3057     32    361    0    0     0     0   42   34  0  1 99  0
 0  0     56   3016     32    361    0    0     0     0   44   29  0  1 99  0
 0  0     56   2976     32    361    0    0     0     0   37   30  1  1 99  0
 0  0     56   2936     32    361    0    0     0     0   37   33  0  1 99  0
 0  0     56   2896     32    361    0    0     0     0   36   31  0  1 99  0
 0  0     56   2856     32    361    0    0     0     0   99   81  0  1 98  0
 0  0     56   2816     32    361    0    0     0     0   40   31  1  0 99  0
 0  0     56   2776     32    361    0    0     0     8   43   36  0  1 99  0
 0  0     56   2736     32    361    0    0     0     0   37   30  0  1 99  0
 0  0     56   2696     32    361    0    0     0     0   37   33  1  1 99  0
 0  0     56   2656     32    361    0    0     0     0   45   46  0  1 99  0
 0  0     56   2616     32    361    0    0     0     0   40   34  0  1 99  0
 0  0     56   2576     32    361    0    0     0     0   49   46  0  1 99  0
 1  0     56   2566     32    361    0    0     0     0   44   52  0  0 100  0
 0  0     56   2535     32    361    0    0     0     0   45   47  0  1 99  0
 0  0     56   2495     32    361    0    0     0     0   41   29  0  1 99  0
 0  0     56   2455     32    361    0    0     0     0   37   31  0  1 99  0
 0  0     56   2415     32    361    0    0     0     0   44   39  0  0 99  0
 0  0     56   2375     32    361    0    0     0     3   48   45  0  1 99  0
 0  0     56   2335     32    361    0    0     0     0   42   42  1  1 99  0
 0  0     56   2295     32    361    0    0     0     0   50   48  0  1 99  0
 0  0     56   2254     32    361    0    0     0     0  107   89  1  1 97  0
 0  0     56   2214     32    361    0    0     0     0   50   39  0  0 99  0
 0  0     56   2174     32    361    0    0     0     8   61   60  1  1 99  0
 0  0     56   2134     32    361    0    0     0     0   92   59  0  1 99  0
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 1  0     56   2094     32    361    0    0     0     0   53   53  0  1 99  0
 0  0     56   2054     32    361    0    0     0     0   49   44  0  1 99  0
 0  0     56   2014     32    361    0    0     0     0   49   46  0  1 99  0
 0  0     56   1974     32    361    0    0     0     0   39   35  0  0 99  0
 0  0     56   1934     32    361    0    0     0     0   39   38  0  0 99  0
 0  0     56   1894     32    361    0    0     0     0   40   31  0  1 99  0
 0  0     56   1854     32    361    0    0     0     1   37   30  0  1 99  0
 0  0     56   1814     32    361    0    0     0     0   42   34  0  1 99  0
 0  0     56   1774     32    361    0    0     0     8   40   39  0  1 99  0
 0  0     56   1734     32    361    0    0     0     0   35   31  0  1 99  0
 0  0     56   1693     32    361    0    0     0     7   38   29  0  1 99  0
 0  0     56   1653     32    361    0    0     0     0   38   29  0  1 99  0
 1  0     56   1643     32    361    0    0     0     0   31   31  0  0 100  0
 0  0     56   1613     32    361    0    0     0     0   33   29  0  0 99  0
 0  0     56   1573     32    361    0    0     0     0   39   25  0  1 99  0
 0  0     56   1532     32    361    0    0     0     0   88   75  0  1 98  0
 0  0     56   1493     32    361    0    0     0     0   40   33  0  1 99  0
 0  0     56   1453     32    361    0    0     0     8   38   31  0  1 99  0
 0  0     56   1413     32    361    0    0     0     0   36   34  0  1 99  0
 0  0     56   3376     32    361    0    0     0     0   81   33  0  2 97  0
 0  0     56   3376     32    361    0    0     0     0   31   37  0  0 100  0

結論:當free消耗掉2G記憶體時,程式被殺掉,Swap沒動作,和上一個結論有點出入(不過這個應該是合理的,上一個有點奇怪)。

3、接著設定為4G結果如下(host總共4G記憶體,所以一定能夠耗光):

 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa

1  0     56    138     33    361    0    0     0     0   75   47  0  1 99  0
 0  0     56    130     33    361    0    0     0     0   39   40  0  0 99  0
 0  1     55    106     28    351    0    0     0     0  541   74  0  1 80 18
 0  1     52     95     23    333    0    0     0     3 3231  100  1  2 73 23
 0  1     51     92     21    298    0    0    80     0 2418  133  1  2 71 23
 0  1     51     91     10    271    0    0     0     0 1314   92  0  1 74 24
 0  1     51     90      4    239    0    0     0     8 2021   88  0  2 73 24
 0  1     51     89      4    200    0    0     0     0 2639   72  0  2 73 23
 0  1     51     88      2    163    0    0     0     0  251   93  0  0 74 25
 0  1     51     83      2    128    0    0   475     0  284   94  0  1 73 24
 0  0     24    129      2     70    0    0     0     0  330   84  0  2 77 19
 0  1     37    113      2     67    0 9056     0  9056  673   66  1  1 95  2
 0  1     62    101      1     64    0 8323    61  8323  801  104  0  1 94  5
 0  1    104    101      0     59    0 14497     0 14497  874  111  1  1 94  5
 0  1    138    122      0     54    0 11433     0 11433  713  123  0  1 91  7
 0  1    163     97      0     51    0 8765     0  8765  458   93  0  1 97  2
 1  0    198    107      0     47    0 11928     0 11928   73  118  0  0 91  8
 0  0    219    132      0     42    0 7217     0  7217  466  146  0  1 94  5
 0  0    271    141      0     38    0 18060    25 18063  555  129  0  1 89  9
 0  0    271    101      0     38    0    0     0     0   35   31  0  0 99  0
 0  0    351    146      0     33    0 27369     0 27369 2499  206  1  2 73 22
 0  0    351    106      0     33    0    0     0     0   51   33  0  0 99  0
 0  0     10   3792      0     33    0    0    81     0   57   40  0  3 97  0

可以看到,free被耗到100M左右,開始消耗Cache,當Cahce耗到50MB左右,開始消耗swpd,最終正好消耗掉4G記憶體,程式終止。CGroup對記憶體的控制還是很精準的。

4、把CGroup大小設定為5G,繼續看結果:

[email protected]:/home/test# vmstat 3 -S M
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 1  0     42   3244     20    229    0    0     0     1    4    6  0  0 76 23
 0  0     42   3203     20    229    0    0     0     0   51   32  0  1 98  0
 0  0     42   3163     20    229    0    0     0     0   46   33  0  1 98  0
 0  0     42   3123     20    229    0    0     0     0   50   29  0  1 98  0
 0  0     42   3083     20    229    0    0     0     0   42   31  0  1 98  0
 0  0     42   3043     20    229    0    0     0     4   43   31  0  1 98  0
 0  0     42   3003     20    229    0    0     0     0   43   35  0  1 98  0
 0  0     42   2963     20    229    0    0     0    11   43   33  0  1 98  0
 0  0     42   2923     20    229    0    0     0    17   44   33  0  1 98  0
 0  0     42   2883     20    229    0    0     0     0   43   34  0  1 98  0
 0  0     42   2843     20    229    0    0     0     0   40   29  1  1 98  0
 0  0     42   2803     20    229    0    0     0     0   41   28  0  1 98  0
 0  0     42   2762     20    229    0    0     0     0   53   33  0  1 96  0
 0  0     42   2722     20    229    0    0     0     0   48   34  0  1 98  0
 1  0     42   2712     20    229    0    0     0     0  110   66  0  1 98  0
 0  0     42   2682     20    229    0    0     0     0   40   27  0  1 97  0
 0  0     42   2642     20    229    0    0     0    11   46   41  0  1 98  0
 0  0     42   2602     20    229    0    0     0     0   53   30  0  1 97  0
 0  0     42   2562     20    229    0    0     0     0   46   36  0  1 98  0
 0  0     42   2521     20    229    0    0     0     0   48   28  1  1 98  0
 0  0     42   2481     20    229    0    0     0     0   41   30  0  1 98  0
 0  0     42   2441     20    229    0    0     0     0   45   31  0  1 98  0
 0  0     42   2401     20    229    0    0     0     0   45   31  0  1 97  0
 0  0     42   2361     20    229    0    0     0     0   49   32  0  1 97  0
 0  0     42   2321     20    229    0    0     0     0   43   31  0  1 98  0
 0  0     42   2281     20    229    0    0     0     0   45   31  0  1 98  0
 0  0     42   2241     20    229    0    0     0     1   43   36  0  1 98  0
 0  0     42   2201     20    229    0    0     0     0   44   30  0  1 98  0
 1  0     42   2199     20    229    0    0     0     9   34   39  0  0 99  0
 0  0     42   2161     20    229    0    0     0     0   47   34  0  1 98  0
 0  0     42   2121     20    229    0    0     0     0   42   30  0  1 98  0
 0  0     42   2079     20    229    0    0     0     0  125   69  1  2 93  0
 0  0     42   2040     20    229    0    0     0     0   57   31  0  2 96  0
 0  0     42   2000     20    229    0    0     0     8   54   38  0  1 97  0
 0  0     42   1960     20    229    0    0     0     0   52   32  0  1 97  0
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 1  0     42   1919     20    229    0    0     0     0   68   27  0  1 95  0
 0  0     42   1880     20    229    0    0     0     0   53   35  0  1 96  0
 1  0     42   1845     20    229    0    0     0     0   46   27  0  1 96  0
 1  0     42   1840     20    229    0    0     0     5   33   29  0  0 99  0
 0  0     42   1800     20    229    0    0     0     0   51   32  0  1 97  0
 0  0     42   1759     20    229    0    0     0     0   44   30  0  1 98  0
 0  0     42   1719     20    229    0    0     0     0   48   31  0  1 98  0
 0  0     42   1679     20    229    0    0     0     0   48   28  0  1 98  0
 0  0     42   1639     20    229    0    0     0     1   45   30  0  1 98  0
 0  0     42   1599     20    229    0    0     0     0   44   34  0  1 98  0
 0  0     42   1559     20    229    0    0     0     8   46   32  0  1 97  0
 0  0     42   1518     20    229    0    0     0     0  133   67  1  2 91  0
 0  0     42   1478     20    229    0    0     0     0   43   33  0  1 98  0
 0  0     42   1439     20    229    0    0     0     8   45   38  1  1 98  0
 0  0     42   1398     20    229    0    0     0     0   42   34  0  1 98  0
 1  0     42   1366     20    229    0    0     0     0   38   31  0  1 98  0
 0  0     42   1358     20    229    0    0     0     0   30   29  0  0 99  0
 0  0     42   1318     20    229    0    0     0     0   42   31  0  1 98  0
 0  0     42   1278     20    229    0    0     0     0   45   35  1  1 98  0
 0  0     42   1238     20    229    0    0     0     0   42   30  0  1 98  0
 0  0     42   1198     20    229    0    0     0     7   41   32  0  1 98  0
 0  0     42   1158     20    229    0    0     0     0   50   33  0  1 98  0
 0  0     42   1118     20    229    0    0     0     0   44   31  0  1 98  0
 0  0     42   1078     20    229    0    0     0     0   42   31  0  1 98  0
 0  0     42   1038     20    229    0    0     0     0   41   36  0  1 98  0
 0  0     42    998     20    229    0    0     0     0   48   39  0  1 98  0
 0  0     42    957     20    229    0    0     0     0  142   70  1  2 93  0
 0  0     42    917     20    229    0    0     0     0   47   32  0  1 98  0
 0  0     42    877     20    229    0    0     0     8   52   35  0  1 97  0
 0  0     42    837     20    229    0    0     0     0   42   33  1  1 98  0
 1  0     42    821     20    229    0    0     0     0   35   29  0  1 99  0
 0  0     42    797     20    229    0    0     0     0   41   33  0  1 98  0
 0  0     42    757     20    229    0    0     0     0   47   32  0  1 98  0
 0  0     42    717     20    229    0    0     0     0   41   34  0  1 98  0
 0  0     42    677     20    229    0    0     0     0   47   40  0  1 98  0
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 1  0     42    637     20    229    0    0     0     0   42   37  0  1 99  0
 0  0     42    597     20    229    0    0     0     0   56   26  0  1 95  0
 0  0     42    557     20    229    0    0     0     0   44   32  0  1 98  0
 0  0     42    517     20    229    0    0     0     0   46   34  1  1 98  0
 0  0     42    476     20    229    0    0     0     3   46   31  0  1 98  0
 0  0     42    436     20    229    0    0     0     0   45   28  0  1 98  0
 0  0     42    396     20    229    0    0     0     0  126   68  0  2 94  0
 0  0     42    357     20    229    0    0     0     0   44   34  1  1 99  0
 0  0     42    317     20    229    0    0     0     8   44   34  0  1 98  0
 1  0     42    296     20    229    0    0     0     0   42   33  0  1 98  0
 0  0     42    276     20    229    0    0     0     0   40   29  0  1 99  0
 0  0     42    236     20    229    0    0     0     0   44   31  0  1 98  0
 0  0     42    196     20    229    0    0     0     0   43   33  0  1 98  0
 0  0     42    156     20    229    0    0     0     0   43   31  0  1 98  0
 0  0     42    116     20    229    0    0     0     0   51   33  1  1 97  0
 0  1     69    106     19    222    0 9365     0  9365 1106  250  0  4 81 12
 0  0    129    115     10    219   64 20347    97 20347 1700  171  0  2 84 13
 2  0    128     86     10    220  129    0   360     0  332   79  0  2 41  4
 0  0    147    115      6    216    0 6235     0  6239  734  181  0  7 64  2
 1  0    187    102      6    207    0 13664     0 13677 1200   79  1  5 85  3
 4  0    209     82      6    204    4 7519    44  7520  179   74  1  2 80  1
 0  0    209    111      6    200   21    0   408     0  409  119  0  1 93  1
 0  0    279    119      6    187    0 23976     0 23995 2029   97  1  2 89  8
 0  0    279    114      6    182    0    0     0     0 1104   36  1  1 98  0
 0  0    333    118      6    172    0 18567     0 18567 1106   76  0  5 86  4
 0  0    333    114      6    167    0    0     0     0 1280   32  0  1 98  0
 0  0    390    119      6    156    0 19391     0 19391 1329   62  1  2 89  8
 0  0    390    119      6    150    0    0     0     0 1099   35  0  1 97  0
 0  1    442    100      6    140    0 17804     0 17819  170   50  0  4 79 11
 0  0    487    114      6    131    0 15239     0 15239 1593   52  1  2 92  5
 2  0    487     82      6    130    0    0     0     0  139   31  0  3 92  0
 0  0    487    122      6    125    5  193   160   193  568   55  0  1 98  0
 0  0    549    118      6    117    0 21037     0 21037 1075  105  0  2 87 10
 0  0    562    119      6    111    0 4281     0  4281 1054   61  0  2 94  1
 0  0    619    119      6    104    0 19539    17 19539  833  109  0  2 88  7
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 1  0    639    124      5     98    0 6919     0  6919  847   73  0  1 95  2
 0  0    684    121      5     91    0 15312     0 15312 1146  106  0  2 93  5
 2  0    699    127      5     86    0 5029     3  5029  342  105  1  5 76  2
 0  1    746    111      5     82    0 16197     5 16197  908   95  0  3 90  4
 0  0    763    120      4     76    0 5665     0  5673  936  113  0  1 93  5
 0  1    791     94      2     75    0 9743     0  9743 1151   66  1  1 95  3
 0  1    839    123      2     68    0 16271     0 16271  119  149  0  1 85 12
 2  0    848     94      2     66    0 2987     0  2987  265   74  1  1 95  2
 0  0    896    136      2     60    0 16496     0 16496  102  113  0  1 91  7
 0  0    939    148      1     55    0 14727     0 14727  100  163  0  1 90  8
 0  0    939    108      1     55    0    0     0     0   28   27  0  0 99  0
 0  0   1003    151      1     51    0 21889     0 21889 1914  102  0  3 84 13
 0  0   1003    111      1     51    0    0     0     0   35   32  0  0 99  0
 0  1   1008     85      1     51    0 2080     0  2083 1436   52  0  2 76 20
 1  1   1023     83      1     49    0 5715     0  5715  310  198  0  1 74 23
 0  0   1023    100      1      7    0    0     0     7  600   44  0  5 85  1

可以看到程式先從主從中消耗掉4G,然後再開始消耗Swap,消耗SWap共1G,正好5G。CGroup和主機記憶體消耗的效果基本一致。

同時也可以看出,記憶體洩露會導致程式退出,或者影響其它程序(系統可用記憶體減少,導致其它程式申請記憶體失敗),但它不會把OS crash掉。