Я создаю программу, которая выделяет много памяти, а затем освобождает.
, когда я проверяю 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 ;
}