C++
 Computer >> コンピューター >  >> プログラミング >> C++

LinuxでC++のメモリ使用量を取得する方法【/proc/self/statの活用】

本記事では、Linux環境上で動作するC++プログラムのメモリ使用量を取得する方法を解説します。

Linuxでは、実行中のプロセスに関する詳細な情報が/proc/self/statファイルから取得できます。このファイルには、PIDやプロセス名だけでなく、メモリに関する統計情報も含まれています。ここでは、その中から「仮想メモリサイズ(Virtual Memory)」と「常駐セットサイズ(Resident Set Size)」の2つの値を取り出す方法を紹介します。

仮想メモリと常駐セットサイズの違い

仮想メモリ(vm_usage)とは、プロセスに割り当てられた仮想アドレス空間全体のサイズを指します。一方、常駐セットサイズ(RSS)は、物理メモリ(RAM)上に実際にロードされているページの合計サイズです。実際にどれだけの物理メモリを消費しているかを知りたい場合は、RSSの方がより実態に近い指標になります。

サンプルコード

以下のコードでは、/proc/self/statをifstreamで開き、ストリーム抽出演算子(>>)を使って不要なフィールドを読み飛ばしながら、vsize(仮想メモリ・バイト単位)とrss(ページ数単位)の値を取得しています。

#include <unistd.h>
#include <ios>
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

void mem_usage(double& vm_usage, double& resident_set) {
    vm_usage = 0.0;
    resident_set = 0.0;
    // /proc/self/stat からプロセス情報を取得
    ifstream stat_stream("/proc/self/stat", ios_base::in);

    // 各フィールドを受け取るための変数を用意
    string pid, comm, state, ppid, pgrp, session, tty_nr;
    string tpgid, flags, minflt, cminflt, majflt, cmajflt;
    string utime, stime, cutime, cstime, priority, nice;
    string O, itrealvalue, starttime;
    unsigned long vsize;
    long rss;

    stat_stream >> pid >> comm >> state >> ppid >> pgrp >> session >> tty_nr
    >> tpgid >> flags >> minflt >> cminflt >> majflt >> cmajflt
    >> utime >> stime >> cutime >> cstime >> priority >> nice
    >> O >> itrealvalue >> starttime >> vsize >> rss; // 残りの項目は使用しない
    stat_stream.close();

    // システムのページサイズをKB単位で取得(多くのx86-64環境では4KB)
    long page_size_kb = sysconf(_SC_PAGE_SIZE) / 1024;

    vm_usage = vsize / 1024.0;      // バイト → KB に変換
    resident_set = rss * page_size_kb; // ページ数 → KB に変換
}

int main() {
    double vm, rss;
    mem_usage(vm, rss);
    cout << "Virtual Memory: " << vm
        << "\nResident set size: " << rss << endl;
}

コードのポイント

  • /proc/self/statは「自分自身のプロセス」の情報を保持しているため、PIDを意識せずに読み取れます。
  • vsizeはバイト単位で格納されているため、1024で割ってKB単位に変換しています。
  • rssは「ページ数」で記録されているため、sysconf(_SC_PAGE_SIZE)で取得したページサイズを掛けることでKB単位に換算できます。

実行結果

Virtual Memory: 13272
Resident set size: 1548

このように、わずか数十行のコードで自身のプロセスのメモリ使用量を簡易的に監視できます。/procファイルシステムを直接参照する手法は、外部ライブラリに依存しないため、パフォーマンス計測やメモリリークの調査など、さまざまな場面で役立ちます。

  1. Firefoxのメモリ使用量を減らす7つの対処法【メモリリーク対策】

    Mozilla Firefoxは、安全性・信頼性・速度に優れたマルチプロセス型のWebブラウザです。少ないメモリ消費で安定したパフォーマンスを発揮するように設計されていますが、状況によっては大量のメモリを消費し、動作が重くなったりクラッシュしたりすることもあります。 Firefoxのメモリ使用量が高止まりしていると感じたら、この記事で紹介する対策をぜひ試してみてください。 Windows PCの場合、メモリリークを簡単に確認するには、タスクマネージャーを開き、「プロセス」タブで「Mozilla Firefox」のメモリ使用量をチェックします。使用量が2GBを超えており、しかも減るどころか増え

  2. LinuxでMicrosoft Officeを使う3つの方法|仮想マシン・ブラウザ版・PlayOnLinux

    WordやExcel、PowerPointといったMicrosoft Officeアプリは、ビジネスパーソンが文書を作成・整理し、クライアントに提示するための最も一般的なツールです。そのため、多くのLinuxユーザーがOfficeをLinux環境で使う方法を模索してきました。代替アプリを個別に購入すれば済むと考える人もいますが、OfficeをLinuxで利用できるようにすれば、ドキュメントをより体系的かつ効率的に管理できるという大きなメリットがあります。Microsoft Officeは非常に人気の高いオフィススイートですが、残念ながらLinux OS向けには正式に提供されていません。これは、