- PR -

VMのメモリ使用量測定方法(servlet)

1
投稿者投稿内容
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2002-11-21 11:22
環境は以下です。
Apacth1.3.26
Tomcat3.3.1
JDK1.3.1

タイトルの通りなのですが
以下のようなものを作りました。

コード:
public class MemoryMonitor extends Thread {
 private static Runtime rt;
	
 public MemoryMonitor() {
  rt = Runtime.getRuntime();
 }
	
 public void run() {
		
  try {
   while( true ) {
    //used memoryの測定(単位:KByte)
    long usedMemory = rt.totalMemory()/1024 - rt.freeMemory()/1024;
				
    log.logging( String.valueOf( usedMemory ) );
				
    //60秒間wait
    synchronized( this ) {
     wait( 60000 );
    }
   }
  } catch( Exception e ) {
   log.logging( e );
  }
 }
}



これをログインサーブレットのinit処理で起動させます。
これで本当にjavaVMが使用しているメモリ量は取れるのでしょうか?
何か指摘箇所があればご意見ください。
セッションにobjectを持つしくみのシステムの場合、多数アクセスに
よってメモリを圧迫すると思います。それらをきちんと測定できるか?
(メモリの精度に関してはだいだいでいいと思ってます)


また、関連した質問なのですが
一つのtomcat上に2つのwebアプリを構築したとします。

片方のwebアプリで上記メモリ測定を起動させた場合、
他方のwebアプリに対するアクセスによるメモリ使用量
もカウントしてしまいますでしょうか?

イメージではtomcat起動によって一つのjavaVMが起動する
と思います。そこから各々のwebアプリのクラスがロード
されるのでメモリはtomcatのjavaVM単位で見るとまとめて
カウントされると考えているのですが正しいでしょうか?


質問をまとめると以下です。
・上記メモリ測定用アプリを起動させて本当にVMのメモリ使用量
 を測定できるか?
・一つのtomcat上の2つのwebアプリは、双方同じVM上で動いている
 ので、片方にメモリ測定を起動させたら双方が使用しているメモリ
 使用量を測定するか?

よろしくお願いします。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2002-12-12 11:39
unibon です。こんにちわ。
#遅い回答ですが。

引用:

(株)ぽちさんの書き込み (2002-11-21 11:22) より:
    //used memoryの測定(単位:KByte)
    long usedMemory = rt.totalMemory()/1024 - rt.freeMemory()/1024;

これで本当にjavaVMが使用しているメモリ量は取れるのでしょうか?
何か指摘箇所があればご意見ください。
セッションにobjectを持つしくみのシステムの場合、多数アクセスに
よってメモリを圧迫すると思います。それらをきちんと測定できるか?
(メモリの精度に関してはだいだいでいいと思ってます)



これで基本的には取得できるはずだと思います。
ただし Java VM 上から見たメモリ使用量は上述のように、
(totalMemory - freeMemory) のような引き算で求まりますが、
OS から見たメモリ使用量はあくまでも totalMemory であるため、
どちらの立場から見たメモリ使用量を気にしているのか、
という立場を明確にしたほうがよいでしょう。
多くの Java VM の実装では totalMemory は一旦増えると減ることがないので、
この違いが問題になります。

また、脇に逸れますが java の起動オプションとして -verbose:gc があるので、
実行時に java のコンソールを表示できれば、
このオプションを使うとプログラムを書かずとも
そこに勝手に同様の情報が出力されるため便利です。
#コンソールを出す方法は知らないですが。

引用:

(株)ぽちさんの書き込み (2002-11-21 11:22) より:
また、関連した質問なのですが
一つのtomcat上に2つのwebアプリを構築したとします。

片方のwebアプリで上記メモリ測定を起動させた場合、
他方のwebアプリに対するアクセスによるメモリ使用量
もカウントしてしまいますでしょうか?



これは tomcat の仕様によると思いますが、
私は知らないのでこちらは省きます。
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2002-12-12 15:56
>unibon様

返答ありがとうございます。

引用:

これで基本的には取得できるはずだと思います。
ただし Java VM 上から見たメモリ使用量は上述のように、
(totalMemory - freeMemory) のような引き算で求まりますが、
OS から見たメモリ使用量はあくまでも totalMemory であるため、
どちらの立場から見たメモリ使用量を気にしているのか、
という立場を明確にしたほうがよいでしょう。



これについてはJavaVM上から見た使用メモリが知りたかったのです。
なので、とりあえず目的のメモリ使用量は取れている感じです。

引用:

多くの Java VM の実装では totalMemory は一旦増えると減ることがないので、
この違いが問題になります。



これは何故なんでしょうね。
わたしも計測していて不思議に思っていました。

使用していないのに上昇したままというのもおかしい気がします。

引用:

これは tomcat の仕様によると思いますが、
私は知らないのでこちらは省きます。



こちらについては、tomcat起動時に一つのVMが起動しますので
複数のwebアプリケーションがあった場合は、全て同一のVMで
管理されてるということがわかいました。


ありがとうございました。
ken
常連さん
会議室デビュー日: 2002/04/29
投稿数: 38
投稿日時: 2002-12-12 16:56
もっとも確実で近道なのは、Borland Optimizeit Suite の
Profiler(プロファイラ)等を使用することだと思います。(^^)

http://www.borland.co.jp/optimizeit/
をどうぞ。
1

スキルアップ/キャリアアップ(JOB@IT)