Sources
Delphi Russian Knowledge Base
DRKB - база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Как узнать расход памяти процессом?

01.01.2007
Vit

Расход памяти можно прочитать из виртуального файла:

/proc/Pid/status

где Pid - номер процесса

function ReadProcData(Pid:string;
                      var VmSize, VmLck, VmRSS, VmData,
                      VmStk, VmExe, VmLib,
                      ProcName:string):boolean;
  var f:TextFile;
      s, stat:string;
      i:integer;

  function getbefore(substr, str:string):string;
  begin
    if pos(substr,str)>0 then
      result:=copy(str,1,pos(substr,str)-1)
    else result:='';
  end;

  function getafter(substr, str:string):string;
  begin
    if pos(substr,str)>0 then
      result:=copy(str,
                   pos(substr,str)+length(substr),
                   length(str))
    else result:='';
  end;

begin
  Result:=False;
  FileMode:=0;
  VmSize:='-1'; VmLck:='-1'; VmRSS:='-1'; VmData:='-1';
  VmStk:='-1'; VmExe:='-1'; VmLib:='-1'; ProcName:='';
  try
    try
      try
        assignFile(f,'/proc/'+Pid+'/status');
        reset(f);
        while not eof(f) do
          begin
            readln(f, s);
            if pos('VmSize', s)>0 then
              VmSize:=GetBefore(' ',trim(GetAfter(':',s)));
            if pos('VmLck', s)>0 then
              VmLck:=GetBefore(' ',trim(GetAfter(':',s)));
            if pos('VmRSS', s)>0 then
              VmRSS:=GetBefore(' ',trim(GetAfter(':',s)));
            if pos('VmData', s)>0 then
              VmData:=GetBefore(' ',trim(GetAfter(':',s)));
            if pos('VmStk', s)>0 then
              VmStk:=GetBefore(' ',trim(GetAfter(':',s)));
            if pos('VmExe', s)>0 then
              VmExe:=GetBefore(' ',trim(GetAfter(':',s)));
            if pos('VmLib', s)>0 then
              VmLib:=GetBefore(' ',trim(GetAfter(':',s)));
            if pos('Name', s)>0 then
              ProcName:=trim(GetAfter(':',s));
          end;
      finally
        closefile(f);
      end;
    finally
      FileMode:=2;
    end;
    Result:=True;
  except
  end;
end;

Примечание

Функция может и не сработать, какие-то мгновения файл недоступен по чтению, выход - повторить процедуру.

Более подробную информацию можно получить запустив в консоли:

man proc
Previous page:
Как посмотреть требуемые библиотеки для бинарника?
Top:
DRKB
Next page:
Как сделать mount?