プロセスのメモリ使用量の確認方法についての質問です。
#実際にプログラミングされている人の方が詳しいかと思い、こちらのカテゴリに
#質問させて頂きます。

プロセスのメモリ使用量を確認するために、パフォーマンスモニタを使おうと
考えています。
「オブジェクト」に「Process」を指定したときの、「カウンタ」では
何を選択すれば確認できるでしょうか。
カウンタごとの説明は読んだのですが、明確に理解することができませんでした。
識者の方、ご教授願います。
また、その他のツールを使った方法があれば教えてください。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

私は以下の方法を使用しています。



WindowsNT系でしたら、タスクマネージャーでプロセス一覧&メモリ使用量が分かります。

95(95~Me)系の場合は、物理メモリに余裕をもたせた状態でシステムモニタを監視しつつプロセスを起動します。(減った分がプロセスの大体のメモリ使用量)

UNIX系だったらコマンド一発レベルで分かるんですけどね~。
    • good
    • 0
この回答へのお礼

アドバイス、ありがとうございました。
参考にさせていただきます。
ただ、タスクマネージャの値はどーも信用できなくて、、、
プロセスをある程度動作させた後、しばらく放置しておくと
メモリ使用量が減ってたりして。。。
ページアウトされた分が減る!?、などと疑ってしまって。。。

お礼日時:2001/08/02 17:42

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qメモリに余裕があるのにヒープが確保できないです。

趣味のプログラムなので切実な問題ではないのですが、
1秒間隔に処理を行うプロセスを-Xmx64Mの指定で6つ起動しようとするのですが、
6つ目でヒープが確保できなくて処理が走りません。
スレッドは1プロセスあたり15くらいです。
OSはWindowsXPでCPUはPentium Dual-core E2140で
メモリは2GBつんでいるのですが、
タスクマネージャでみると1GB強しかつかってません。
できれば6つ同時に走らせたいのですが、方法はありますでしょうか?

Aベストアンサー

ヒープエリアはたしか全プロセスで共通に使われるはずです。
-Xmx64M を -Xmx128M 等に変更して動かしてみて下さい。

Qプロセスの使用している仮想メモリ量について

はじめまして。

現在作成中のプログラムで仮想メモリの使用量が増加していく現象が発生しています。これは、Windows2000のパフォーマンスモニタを利用して発見したものです。

そこで、仮想メモリの使用量を調べるためにWindowsAPI関数を調べているのですが、システム全体のメモリ使用量等がわかるGlobalMemoryStatus関数があることは分かりました。

システム全体ではなく、特定のプロセスの仮想メモリ使用量がわかる関数または手法をご存知の方は教えてください。

よろしくお願いします。

Aベストアンサー

 プログラム側からはたしか、リアルメモリと仮想メモリの区別は付かなかったんじゃなかったでしたっけ。でないと仮想「メモリ」である意味がありませんから。自信なし。

 で、この質問の回答ではありませんが、その現象は十中八九メモリリークです。
 「アロックしたままフリーしてない」とか「内部でアロックするAPIを呼び、そのままフリーしてない」といったような部分が、おそらくはあるはずです。
 それらを一度全部見直してみてください。

 Win32 API の中には、構造上、「アロックはするけどフリーはしない」関数が山のようにありますので。

QC/C++言語のメモリについて

C言語でメモリを2種類?に分けると、スタックとヒープがあります。
ヒープは mallocなどで確保し、freeで解放しますがスタックは解放する必要がありません。
そのスタックは通常、何バイトまで可能なのでしょうか?

あと関数外のファイルの先頭に int[1000000];とした場合、このメモリはmallocで確保していませんが、
どこに作られるのでしょうか?

私のパソコンはメモリが2GBでWindows2000ですが、CやC++で最大、何バイトまでメモリが使えますか?
また、一番多くメモリを確保できるなら、OSはなんでも構いません。

解釈等も間違っていたらご指摘していただきたいです。

Aベストアンサー

マイコン向けのプログラムを書いてます、Interestと申します。

> C言語でメモリを2種類?に分けると、スタックとヒープがあります。

間違いではありませんが、ちょっと足りません。プログラムで使用するメモリはもう少し細かく見ると、次のようになっています。

(P) 実行される命令(ProgramとかCodeと呼ばれます)
(C) 定数など変更されないデータ
(D) 初期化されるデータ
(B) 初期化されないデータ
(H) プログラムから動的に割り当てられるメモリプール(これがヒープです)
(S) ローカル変数、関数の引数、呼び出し元関数へのリンクに使用する比較的短命なものに使用するメモリプール(これがスタックです)

> そのスタックは通常、何バイトまで可能なのでしょうか?

開発環境によって初期値が決まっているようで、どれだけ割り当てるか変更できるようです。OSには依存しません。Visual C++ 6.0の場合、スタックサイズの初期値は1MBだそうです。
参考 http://okwave.jp/qa2645032.html

> あと関数外のファイルの先頭に int[1000000];とした場合、
> このメモリはmallocで確保していませんが、どこに作られる
> のでしょうか?

最初に説明した内容に照らすと、一般に外部変数は0で初期化されますから、(D) 初期化されるデータ の領域に確保されることがわかります。

> 私のパソコンはメモリが2GBでWindows2000ですが

WindowsなどのOSは物理メモリが足りなければハードディスク上の仮想メモリも使用しますので、単純に何バイトまで使えます、とはお答えできません。

> 一番多くメモリを確保できるなら、OSはなんでも構いません。

どのようなプログラムを組もうとしているのですか?

マイコン向けのプログラムを書いてます、Interestと申します。

> C言語でメモリを2種類?に分けると、スタックとヒープがあります。

間違いではありませんが、ちょっと足りません。プログラムで使用するメモリはもう少し細かく見ると、次のようになっています。

(P) 実行される命令(ProgramとかCodeと呼ばれます)
(C) 定数など変更されないデータ
(D) 初期化されるデータ
(B) 初期化されないデータ
(H) プログラムから動的に割り当てられるメモリプール(これがヒープです)
(S) ローカル変数、関...続きを読む

Qc# 他プロセス起動 リダイレクト(入力) バイナリファイルの場合

現在、c#で他プロセスを起動させるプログラムを組んでいるのですが、リダイレクトでつまづいています。
(コンパイルが出来ない->どう記述すれば良いのか分からない。)

ファイルストリームのReadはデータをByteの配列に格納しますが、リダイレクト入力のwriteはcharの配列を引数としているみたいで、どう記述すれば良いのか分かりません。

記述方法または参考URLを教えていただけないでしょうか?

--source--
 System.IO.Stream retstream = new FileStream(wkPath, FileMode.Open, FileAccess.Read, FileShare.Read);
 System.Diagnostics.Process myProcess = new System.Diagnostics.Process();

 myProcess.StartInfo.FileName = "C:\\Program Files\\proc\\process.exe";

 myProcess.StartInfo.UseShellExecute = false;
 myProcess.StartInfo.RedirectStandardInput = true;
 myProcess.StartInfo.RedirectStandardOutput = true;

 if (strmInput.Length > 0) {
  int num = 0;
  byte[] bufWk = new byte[65536];

  while (true) {
   num = strmInput.Read(bufWk, 0, bufWk.Length);
   if (num == 0) {
    break;
   }
   myProcess.StandardInput.Write(bufWk, 0, num); //←コンパイルエラー
  }
 }

--エラー内容--
System.IO.TextWriter.Write(char[], int, int)' に最も適しているオーバーロード メソッドには無効な引数がいくつか含まれています。
引数 '1': 'byte[]' から 'char[]' に変換できません。

現在、c#で他プロセスを起動させるプログラムを組んでいるのですが、リダイレクトでつまづいています。
(コンパイルが出来ない->どう記述すれば良いのか分からない。)

ファイルストリームのReadはデータをByteの配列に格納しますが、リダイレクト入力のwriteはcharの配列を引数としているみたいで、どう記述すれば良いのか分かりません。

記述方法または参考URLを教えていただけないでしょうか?

--source--
 System.IO.Stream retstream = new FileStream(wkPath, FileMode.Open, FileAccess.Rea...続きを読む

Aベストアンサー

未検証。動くかどうか知らない

http://msdn.microsoft.com/en-us/library/system.io.streamwriter.basestream.aspx
StreamWriterはBaseStreamプロパティをもち、
Streamクラスは
http://msdn.microsoft.com/en-us/library/system.io.stream.write.aspx
byte配列を引数に持つ、writeメソッドを持つ。

Qヒープ領域の限界値設定

大量にメモリを消費するアプリケーションを下記環境で動作させようとしています。
WindowsXP SP2, 1GB RAM
タスクマネージャの物理メモリの利用可能 674,500K位
この状態でヒープ領域をレジストリで変更しようと思っているのですが
限界値が不明です。
徐々に3071⇒4096⇒8192と上げていっているのですが、限界値を超してしまうとOS自体が起動できなくなる恐れがあるので怖いです。
アドバイスください。

Aベストアンサー

回答No.1に挙げた「デスクトップ ヒープ」で用いている「ヒープ」という用語は、グラフィックサブシステムで使用するためにWindowsのグラフィックサブシステムがあらかじめ確保して自分自身のために使用するメモリ領域のことを指しています。

また「mallocが使用するヒープ領域」という場合の「ヒープ」という用語は、ライブラリ関数mallocがWindows APIを使用して確保するメモリ領域のことを指しています。

ですので、「デスクトップ ヒープ」と「mallocが使用するヒープ領域」は違うものです。


「mallocが使用するヒープ領域」がどこから来るのかは、コンパイルに使用した言語環境のライブラリ関数mallocの動作内容に依存します。

仮にMicrosoft Visual C++(VC++ Version 6.0以降)を使用してコンパイルし、ライブラリ関数は標準添付のものを使用したとすると、mallocはWindows APIのHeapAllocで取得したメモリ領域をライブラリ内で細分(サブアロケート)して返します。またこの場合、HeapAllocで取得できるメモリ領域の量に固定の上限はなく、PCのメモリ実装量、Windowsのスワップ領域の大きさ、それとアプリケーションプロセスのメモリマップが許す限り、いくらでもHeapAllocはメモリを割り当てて返すことができます。

ですので上記の場合、mallocも同様に「PCのメモリ実装量、Windowsのスワップ領域の大きさ、それとアプリケーションプロセスのメモリマップが許す限りいくらでも」メモリを割り当てて返すことができます。

なお、上記動作はライブラリのソースコードを見て確認したものですので、使用しているコンパイラがVC++ではない、あるいはVC++でもVersion 6.0より古い場合、mallocが「いくらでもメモリを割り当てて返すことができる」かどうかは分かりません。(しかし、返すメモリ領域が「デスクトップ ヒープ」と違うものであることだけは変わりません。)

回答No.1に挙げた「デスクトップ ヒープ」で用いている「ヒープ」という用語は、グラフィックサブシステムで使用するためにWindowsのグラフィックサブシステムがあらかじめ確保して自分自身のために使用するメモリ領域のことを指しています。

また「mallocが使用するヒープ領域」という場合の「ヒープ」という用語は、ライブラリ関数mallocがWindows APIを使用して確保するメモリ領域のことを指しています。

ですので、「デスクトップ ヒープ」と「mallocが使用するヒープ領域」は違うものです。


「mal...続きを読む

Q[C#]リモートアクセスのProcess取得で「アクセス拒否」

現在、PCのプロセスを取得するプログラムを作っています。

しかし、リモートコンピューターからGetProcessesByNameでプロセスを取得しようとすると、アクセス拒否の例外が出てしまいます。
具体的には、以下のような例外をキャッチできるのですが、アクセス拒否されないために必要な条件となんでしょうか?
またエラー回避策、ヒントなど、教えていただければ幸いです。

よろしくお願いします。

--------------------------------------
try{
Process [] targetProcess = Process.GetProcessesByName(プロセス名 , リモートコンピューター名);
}
catch(System.InvalidOperationException e){
Debug.WriteLine(e.Source + ":1" + e.Message);
System.Exception se = e.InnerException;
Debug.WriteLine(se.Source + ":2:" + se.Message);
}
--------------------------------------

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

--------------------------------------
System:1:リモート コンピュータからプロセス情報を取得できませんでした。
System:2:アクセスが拒否されました。
--------------------------------------


参考:http://oshiete1.goo.ne.jp/kotaeru.php3?q=1596734

現在、PCのプロセスを取得するプログラムを作っています。

しかし、リモートコンピューターからGetProcessesByNameでプロセスを取得しようとすると、アクセス拒否の例外が出てしまいます。
具体的には、以下のような例外をキャッチできるのですが、アクセス拒否されないために必要な条件となんでしょうか?
またエラー回避策、ヒントなど、教えていただければ幸いです。

よろしくお願いします。

--------------------------------------
try{
Process [] targetProcess = Process.GetProcessesByNam...続きを読む

Aベストアンサー

回さないで取る方法がありました。

先ほどの延長で、
targetProcess = Process.GetProcesses(端末A);
targetProcess2 = targetProcess(0).GetProcessesByName("iexplore",端末A);
としたら、取得できました。

※端末AはAdmin権限あり

GetProcessesByNameを実行するプロセスオブジェクトが、その端末にないとダメっぽいですね^^

Qメモリをたくさん使うテストプログラム

Linuxで、メモリをたくさん使うようなテストプログラムを作りたいのです。
メモリといっても、プログラムコードの入っているテキスト領域、データの入っているデータ領域、ヒープ領域などがあると思いますが、
これらのいずれかのみをたくさん使うようなプログラムを作りたいのです。
例えば、サイズの大きなプログラムであれば、テキスト領域が大きくなったり、
大容量の文字列を扱ったりすると、データ領域が大きくなったりするんでしょうか?
関数とメモリ使用量の関係があまり分かっていません。
どうか教えてください。

Aベストアンサー

#1です。
>テキスト領域を大量に確保するには、無駄に長いプログラムを書けばいいのでしょうか?
はい、その通りです。
>mallocした領域にデータを書き込むと、今度はデータ領域がたくさん使われるのでしょうか?
いいえ、mallocした領域は、ヒープ領域であり、ヒープ領域にデータを書き込んだからといって、データ領域が増える訳ではありません。

コーディングでは、以下のようになります。
-----------------
#include ....ヘッダファイル
char data1[256];  ・・・・データ領域
main()
{
data data2[256];  ・・・・スタック領域
if (・・・){    ・・・・テキスト領域
・・・
}
malloc(3000)    ・・・ヒープ領域へ確保
}

main等の関数の外側で確保した領域は、データ領域に取られます。
main等の関数の内側で確保した領域は、スタック領域に取られます。(static指定を除く)
実際に命令(if文など)は、テキスト領域にとられます。
mallocで確保したメモリはヒープ領域に取られます。
(但し、テキスト領域の言葉は正しいかどうか不明です。参考URLを参照下さい)
ところで、どうして、メモリをたくさん使うようなテストプログラムを作りたいのですか、よかったら教えて下さい。そのほうに興味があります。

参考URL:http://www1.cts.ne.jp/~clab/hsample/Point/Point19.html

#1です。
>テキスト領域を大量に確保するには、無駄に長いプログラムを書けばいいのでしょうか?
はい、その通りです。
>mallocした領域にデータを書き込むと、今度はデータ領域がたくさん使われるのでしょうか?
いいえ、mallocした領域は、ヒープ領域であり、ヒープ領域にデータを書き込んだからといって、データ領域が増える訳ではありません。

コーディングでは、以下のようになります。
-----------------
#include ....ヘッダファイル
char data1[256];  ・・・・データ領域
main()
{
data...続きを読む

Q【C#】別プロセスがロックかけているファイルの読込

別プロセスが更新を行っているファイルを読み取り専用で読み込みたいのですがIOExceptionがでて読み込めません。

■エラーメッセージ
別のプロセスで使用されているため、プロセスはファイル '※ファイル名※' にアクセスできません。

■エラーがおきているところ
StreamReader sr = new StreamReader(@tempFile, Encoding.Default);

ノートパットではエラーなしで開けました。サクラエディタではロックを取得できませんでした。のメッセージは出ましたが中身をみることはできました。

どうかご教示の程よろしくお願いいたします。

Aベストアンサー

FileShareを引数に持つFileStreamのコンストラクタで明示的に開くことになるかと。

MSDN: FileStream コンストラクター (String, FileMode, FileAccess, FileShare) (System.IO)
http://msdn.microsoft.com/ja-jp/library/5h0z48dh.aspx


StreamReaderはその名のとおり,Streamから文字列を読み込むためのクラスです。
ファイル名を指定できるコンストラクタはありますが,内部ではStreamを用意しています。
細かい制御をするには,元となるStream自体の開き方を変えるしかないです。

Qjava string 配列の使用メモリ

String[][][] arg = = new String[x][x][x];
でxが638の時にjava.lang.OutOfMemoryErrorになってしまいます。
VM起動時のヒープ最大値は1GBまで試しましたがダメでした。

このときargオブジェクトはどれだけのメモリを必要とするのでしょうか?

Aベストアンサー

このnewで作られるオブジェクトは、配列オブジェクトだけです。Stringオブジェクト自体は作られません。
なので、オブジェクトのサイズとしては、配列オブジェクトのサイズだけを考えればよいことになります。
(ちなみに、メソッド本体はクラスに1つあるだけで、作成したオブジェクトの数だけできるわけではないですから、オブジェクトを作ると、新たにメソッドの分のメモリが必要になるわけではありません)

さて、argオブジェクトのサイズですが、1つのオブジェクトへの参照を保持するのにまず何バイトが必要か考える必要があります。
32bitのJavaだったら、たぶん32bit=4バイトでしょう。
この配列の要素数はx^3個ですので、1つあたりが4バイトとなると、x^3 * 4 バイトのメモリが最低限必要ということになります。
もちろん、他にも多少メモリが必要でしょうが、xが大きいときのことを考えるわけですし、無視しても問題ないでしょう。

x=638の場合を計算してみると、638^3 * 4 = 1038776288 となります。
これは約990MB で、だいたい1GBです。
ヒープの最大値を1GBで試したということですので、計算と合っているのではないでしょうか。

このnewで作られるオブジェクトは、配列オブジェクトだけです。Stringオブジェクト自体は作られません。
なので、オブジェクトのサイズとしては、配列オブジェクトのサイズだけを考えればよいことになります。
(ちなみに、メソッド本体はクラスに1つあるだけで、作成したオブジェクトの数だけできるわけではないですから、オブジェクトを作ると、新たにメソッドの分のメモリが必要になるわけではありません)

さて、argオブジェクトのサイズですが、1つのオブジェクトへの参照を保持するのにまず何バイト...続きを読む

Q子プロセスと親プロセス

ある本を読んでいると、以下のような問いにぶち当たり、プログラムの仕方がよくわからないのです。
自分でもいろいろ調べたのですが、わからないので質問させていただきます。

自分のプロセスIDと親のプロセスIDのプロセスIDを表示するコマンドshowpidを作り、showpidを子プロセスとして10回実行するプログラムを作りなさい。ただし、execを用いてshowpidを10回実行すること。

というものなのですが、自分のプロセスIDと親のプロセスIDの表示方法はわかったのですが、それをコマンドとして作り、子プロセスとして10回実行する方法がわからなくて困っております。。。

言語はc言語を使ってもらいたいです。以下に自分のプロセスIDと親のプロセスIDを表示するプログラムを付けときます。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main(){
pid_t pid;
int status;
if((pid=fork())==0)
printf("I am a child with pid=%d. My parent pid is %d.\n",getpid(),getppid());
else{
wait(&status);
exit(EXIT_SUCCESS);
}

ある本を読んでいると、以下のような問いにぶち当たり、プログラムの仕方がよくわからないのです。
自分でもいろいろ調べたのですが、わからないので質問させていただきます。

自分のプロセスIDと親のプロセスIDのプロセスIDを表示するコマンドshowpidを作り、showpidを子プロセスとして10回実行するプログラムを作りなさい。ただし、execを用いてshowpidを10回実行すること。

というものなのですが、自分のプロセスIDと親のプロセスIDの表示方法はわかったのですが、それをコマンドとして作り、子プロセス...続きを読む

Aベストアンサー

showpid.c では単に、getpid() と getppid() の結果を出すだけでいいです。それをコンパイルすればコマンドが出来ます。

メインのプログラムでは、こんな感じで。
for(10回ループ) if(fork()==0) execv(showpidコマンド)


人気Q&Aランキング

おすすめ情報