Почему RSS не уменьшается при звонке бесплатно - PullRequest
0 голосов
/ 24 октября 2019

Я создаю программу, которая выделяет много памяти, а затем освобождает.

, когда я проверяю RSS с /proc/{pid}/status, при первых нескольких попытках он показывает уменьшение RSS, когда освобождается память. но после первой итерации RSS остается и больше не уменьшается.

Может кто-нибудь помочь мне объяснить, почему RSS не уменьшается.

Вот несколько снимков результата.

./test
 holding 1000000
ps | grep test
17196 pts/1    00:00:00 test
cat /proc/17196/status | grep Rss
RssAnon:            1104 kB
RssFile:            2832 kB
RssShmem:              0 kB

c
 holding none
cat /proc/17196/status | grep Rss
RssAnon:             184 kB
RssFile:            3088 kB
RssShmem:              0 kB

l
 holding 1000000
cat /proc/17196/status | grep Rss
RssAnon:             972 kB
RssFile:            3088 kB
RssShmem:              0 kB

c
 holding none
cat /proc/17196/status | grep Rss
RssAnon:             972 kB
RssFile:            3088 kB
RssShmem:              0 kB

Я использую

gcc version 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1)
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.3 LTS
Release:        18.04
Codename:       bionic

Вот тестовая программа, которую я использую

#include <iostream>
#include <vector>

#include <cstdio>

using namespace std;

enum class SmState
{
    CLEAR,
    MEM_SMALL,
    MEM_LARGE,
    EXIT
};

class Sm
{
private:
    SmState m_state;

    //return true if set, otherwise return false.
    bool setState( char c )
    {
        switch( c )
        {
            case 'c':
                m_state = SmState::CLEAR;
                return true;
            case 's':
                m_state = SmState::MEM_SMALL;
                return true;
            case 'l':
                m_state = SmState::MEM_LARGE;
                return true;
            case 'x':
                m_state = SmState::EXIT;
                return true;
            default:
                return false;
        }

        return false;
    }

    //wait until receive next state.
    void wait()
    {
        char c;
        cout << " Press 'x' to exit" << endl;
        cout << "       'c' to clear hold memory" << endl;
        cout << "       's' to hold small memory" << endl;
        cout << "       'l' to hold large memory" << endl;
        do
        {
            c = getchar();
        }
        while( setState( c ) );
    }

    void mclear()
    {
        cout << " holding none" << endl;
        wait();
    }

    void mhold( int len )
    {
        char * myc = (char*) malloc( sizeof( char ) * len );

        for( int i = 0; i < len; ++i )
        {
            myc[i] = i;
        }

        cout << " holding " << len << endl;
        wait();

        free( myc );
    }

public:
    Sm():
        m_state( SmState::MEM_LARGE )
    {
    }

    void start()
    {
        while( m_state != SmState::EXIT )
        {
            switch( m_state )
            {
                case SmState::CLEAR:
                    mclear();
                    break;
                case SmState::MEM_SMALL:
                    mhold( 400000 );
                    break;
                case SmState::MEM_LARGE:
                    mhold( 1000000 );
                    break;
                default:
                    break;
            }
        }
    }
};

int main( int argc, char ** argv )
{
    Sm st;
    st.start();

    return 0 ;
}

...