0
1

More than 5 years have passed since last update.

c++ builder XE4, 10.2 Tokyo > アプリ使用メモリの確認 > GetProcessMemoryInfo()使用 > WorkingSetSize: DLLの使用分を含んだメモリ使用量

Last updated at Posted at 2016-08-19
動作確認
C++ Builder XE4

関連 http://qiita.com/7of9/items/b6b8991cd898f5272077

実行アプリの使用メモリを確認したい。

参考
http://blog.goo.ne.jp/masaki_goo_2006/e/7a33fc63935919da2fd3f3bec37f8695

  • #pragma comment( lib, "psapi.lib" ) 追加
  • #include <psapi.h> 追加
  • Button1Click()処理追加

code v0.1

Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#pragma comment( lib, "psapi.lib" )
#include <psapi.h>

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    int LSize;
    PPROCESS_MEMORY_COUNTERS LProcessMem;
    int LMemUsed;

    LSize = sizeof(PPROCESS_MEMORY_COUNTERS);

    bool res = GetProcessMemoryInfo(GetCurrentProcess(), LProcessMem, LSize);
    if (res) {
        LMemUsed = LProcessMem->WorkingSetSize;
    }

    LMemUsed = LMemUsed / 1024; // to KB
    LMemUsed = LMemUsed / 1024; // to MB

    String msg = IntToStr(LMemUsed) + L" used";
    OutputDebugString(msg.c_str());

}
//---------------------------------------------------------------------------

タスクマネージャにて2208Kの使用と表示され、上記のコードでは1913 userと表示された。
値が小さい原因は未消化。

1913 userは1913MB。タスクマネージャの表示と単位が違う。

メモリリーク時に相対的に増加するのをみてデバッグに使えるかどうか。

code v0.2

参考
http://stackoverflow.com/questions/8644110/how-to-use-getprocessmemoryinfo-in-c

PPROCESS_MEMORY_COUNTERS

PROCESS_MEMORY_COUNTERS
の指定間違いでGetProcessMemoryInfo()がエラーとなっていた。

以下のように修正した。

Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#pragma comment( lib, "psapi.lib" )
#include <psapi.h>

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    int LSize;
    PROCESS_MEMORY_COUNTERS LProcessMem;
    int LMemUsed;

    LSize = sizeof(LProcessMem);

    bool res = GetProcessMemoryInfo(GetCurrentProcess(), &LProcessMem, LSize);
    if (res) {
        LMemUsed = LProcessMem.WorkingSetSize;
    } else {
        LMemUsed = 0;
    }

    LMemUsed = LMemUsed / 1024; // to KB

    String msg = IntToStr(LMemUsed) + L"K used";
    ShowMessage(msg);
    OutputDebugString(msg.c_str());

    int nop=1;

}
//---------------------------------------------------------------------------

しかしながら、タスクマネージャで得られるメモリ使用量と上記コードで得られる使用量がオーダーで異なる問題は解消していない。

  • タスクマネージャ: 2MB
  • 上記コード: 14MB

メモリリークチェック対象のプログラムの場合

  • タスクマネージャ: 16MB
  • 上記コード: 29MB

12,3MB多い。DLLなどによるメモリもカウントされているのかもしれない。

以下にDLLを含んでいるとの情報が見つかった。

The working set of a program is a collection of those pages in its virtual address space that have been recently referenced. It includes both shared and private data. The shared data includes pages that contain all instructions your application executes, including those in your DLLs and the system DLLs.

DLLの分を含んではいるが、メモリリーク解消のチェックに上記コードは使えるだろう。

10.2 Tokyo

10.2 Tokyoでは#pragma comment( lib, "psapi.lib" )は不要である。
C++ Builder 10.2 Tokyo > psapi.hを使う > #pragma comment(lib, "psapi.lib")は追加不要 (XE4から10.2Tokyoへの移行)

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1