- PR -

セッション情報のメモリ使用容量について

投稿者投稿内容
うな
会議室デビュー日: 2003/10/13
投稿数: 15
投稿日時: 2007-02-08 18:07
現在 J2sdk1.4.2 + Oracle Application Server 10gの環境で動いているアプリについてセッション情報がどれだけのメモリを使用しているか調査したいのですがどのようにして調べるのが一番確実でしょうか?
そもそも、servletで使用するセッションはJavaVM上のメモリを使用しているという考えでよいのでしょうか?
一人の人がアクセスしたときにどれだけのメモリを使用するのかということがそもそも調べたかったことでこの質問をあげさせていただいた理由です。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2007-02-08 18:34
引用:

うなさんの書き込み (2007-02-08 18:07) より:
そもそも、servletで使用するセッションはJavaVM上のメモリを使用しているという考えでよいのでしょうか?



必ずしもVM上のヒープに存在しているとは限りません。
コンテナはHttpSessionをファイル等にスワップアウトする事もできます。
いくつかのJ2EEコンテナはそのように設定できたと記憶しています。

引用:

現在 J2sdk1.4.2 + Oracle Application Server 10gの環境で動いているアプリについてセッション情報がどれだけのメモリを使用しているか調査したいのですがどのようにして調べるのが一番確実でしょうか?



確実に計測するのは難しそうですが、
HttpSessionの全ての属性をシリアル化して、
結果のストリームの長さを測ればおおよその傾向はわかるのでは?
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2007-02-08 18:49
1. -Xms -Xmx を同じにしてヒープサイズを固定
2. -verbosegc オプションをつけてGCログを記録するように設定
3. サーバ起動後一人分のテストケースを動かしてウォームアップ
4. System.gc() してヒープの使用量を確認 -> A
5. 1000人分とかテストケースを動かす
6. System.gc() してヒープの使用量を確認 -> B
7. (B-A) / 1000 くらい

とかでどうでしょう。
うな
会議室デビュー日: 2003/10/13
投稿数: 15
投稿日時: 2007-02-08 18:57
あしゅさん、ありがとうございます。

> 必ずしもVM上のヒープに存在しているとは限りません。
> コンテナはHttpSessionをファイル等にスワップアウトする事もできます。
> いくつかのJ2EEコンテナはそのように設定できたと記憶しています。


勉強不足なので検討違いなことをいっているかもしれませんが、
特に設定していなければ、VM上のヒープに存在していると考えてよいということでしょうか?

> HttpSessionの全ての属性をシリアル化して、
> 結果のストリームの長さを測ればおおよその傾向はわかるのでは?

シリアル化というところがあまり理解できていないのですが、
プログラムを組みこむということでしょうか?
プログラム組み込むのはできないので、ツールやパフォーマンスモニタで見れないかと思ったのですが。ちなみにサーバーはWin2003です。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2007-02-09 01:02
引用:

勉強不足なので検討違いなことをいっているかもしれませんが、
特に設定していなければ、VM上のヒープに存在していると考えてよいということでしょうか?


そんなのは実装次第です。ソースが公開されていなければ、
プロファイラやデバッガで中身を確認するまではわからないでしょう。
分散処理などを行うと、セッションのレプリカを持ったりすることもありますし、
一概にVM上のヒープのみを使用しているとは言い切れないです。

ちなみにJDK1.4以降ではヒープ外のメモリを使用することも出来ます。
(java.nio.ByteBuffer#allocateDirect)

シリアル化とは直列化とも言いますが、
簡単に言えばJavaのオブジェクトをバイト配列にすることです。
java.io.Serializableの説明を読んでみてください。

例えば、test.jspを作って、
コード:
<%
java.util.Enumeration e = session.getAttributeNames();
long size = 0;
while(e.hasMoreElements()){
    String key = (String)e.nextElement();
    Object obj = session.getAttribute(key);
    java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream();
    java.io.ObjectOutputStream oos = new java.io.ObjectOutputStream(baos);
    oos.writeObject(obj);
    size = size + baos.size()
}
out.prinitln("size=" + size);
%>


これで、1セッションの直列化されたバイト数がわかります。
(動くか確認してないけど・・・)

サーバにこのJSPを忍ばせればセッションサイズが確認できますし、
他の動作には全く影響を与えないと思いますが。
うな
会議室デビュー日: 2003/10/13
投稿数: 15
投稿日時: 2007-02-09 08:29
インギさん、かつのりさんありがとうございます。
ヒープを使用しているか実装を確認してみることにします。

サイズはかつのりさんのソースを参考にサイズを見てみることとします。

ありがとうございました。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2007-02-09 09:50
>これで、1セッションの直列化されたバイト数がわかります。
直列化した形式から、ヒープ領域を占めるサイズがわかるのでしょうか?
もちろんある程度相関関係はあるでしょうけど、あまり一致しなさそう、という感覚があります。
例えば直列化された形式には型がフルパッケージ名で記録されていると思うのですが、ヒープ内でインスタンスを保持するときには型のポインタが記されているだけですよね?もちろん実装にもよりますが。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2007-02-09 10:23
>インギさん
サイズまではわかりませんが、ValueObject系なら多少の目安にはなるかなと。
インスタンス化されたときとは構造が違いますし、
よってどのようにメモリを消費しているかもVM次第なので、
微妙かもしれませんね。

どちらかといえば、クラスタ化したときの、
転送コストの目安にしかならないかもしれませんね。

プロファイラを使うに越したことはありません。

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