- PR -

配列を返すためのDWRの使い方が悪いのか、メモリがリークする件。

投稿者投稿内容
フジタ
常連さん
会議室デビュー日: 2007/10/19
投稿数: 23
お住まい・勤務地: 茨城県
投稿日時: 2007-12-03 15:23
一定間隔で下記のように配列をDWRにて取得しているのですが、
どんどん数キロバイトずつメモリ使用量が増えてしまいます。
どこかでクリアするか、使い方が間違っているのでしょうか?
よろしくお願い致します。

HTML内
function sendName() {
Ajax.real_time_data(callback);
}

function callback(res) {
     検証のため何も書いていません。
}

DWRのクラス.JAVA内

 public String[][] real_time_data() {
String[][] stringArray = new String[10][20];

stringArray[0][0] = "供給コンベア";
stringArray[3][12] = "ブザー Y2F";
return stringArray;
 }
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2007-12-04 11:25
メモリ使用量(プロセスサイズ?)や、ヒープ使用量が増えることは問題ではありません。
ガベージコレクションが行われても減らないとすると問題ですが。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-12-04 13:06
メモリ使用量ってのは何で確認していますか?
VMが使うメモリ量とVM上で動くJavaアプリケーションが使うメモリ量の区別はついていますか?

DWR(Direct Web Remotingと思われる)は使ったことないのでよく分かりませんが
もしリークがあるのであれば、バグパレードなどに情報があるかもしれません。
フジタ
常連さん
会議室デビュー日: 2007/10/19
投稿数: 23
お住まい・勤務地: 茨城県
投稿日時: 2007-12-04 13:36
返信ありがとうございます。
インギさん
JAVAは自動的に使われなくなったオブジェクトをガベージコレクションにより整理すると思いますが、メモリがリークするのはどのような時なのですか?
今回のようなグローバル変数で比較的大きめな配列を2秒間隔で呼び出していった場合、はメモリ的には増えて行ってしまうのでしょうか?

public String[][] real_time_data() {
String[][] stringArray = new String[10][20];
return stringArray;
 }

実際には増えてしまっているのですけど。。
フジタ
常連さん
会議室デビュー日: 2007/10/19
投稿数: 23
お住まい・勤務地: 茨城県
投稿日時: 2007-12-04 13:52
返信ありがとうございます。NAGISEさん。

>>メモリ使用量ってのは何で確認していますか?

windows タスクマネージャ の中で、プロセス欄にある
TOMCAT5,EXE は 257000k 
httpd.EXE が 54891k っで こっちが増えていきます。

>>VMが使うメモリ量との区別はついていますか?

申し訳ありませんが、VM上で動くJavaアプリケーションが使うメモリ量
は httpd.EXE(アパッチ)が使うメモリ量に含まれているのでは無いのでしょうか?
そのように考えていましたが、

今回の件は、アパッチ と TOMCAT を連携して 外部のブラウザでwebアプリケーションを起動しています。

この場合、TOMCAT上でプログラムが動いていて、そのメモリーは増加していないので
アパッチの方に問題があるのでしょうか?
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-12-04 14:41
イメージとしては、VMがOSからある程度まとめてメモリを確保し、
それをアプリケーションにたいして配っているわけです。
そして、GCで不要なオブジェクトを回収した際に、
OSにメモリを直ちに返すのではなく、次にオブジェクトを生成したときのために
空いたメモリをVMがストックしておくわけです。

これが、OSから見るVMの使用しているメモリ量を眺めても
VM内での空きメモリ量(=アプリケーションに配る余裕のあるメモリ量)や使用量を測れない理由です。
OSから眺めてもVM内でどれだけの量が空いているのかはわかりません。

jconsoleなどを使用するなり、
java.lang.Runtime#freeMemory()の値を参照するなりしてください。


[ メッセージ編集済み 編集者: nagise 編集日時 2007-12-04 14:42 ]
フジタ
常連さん
会議室デビュー日: 2007/10/19
投稿数: 23
お住まい・勤務地: 茨城県
投稿日時: 2007-12-04 14:59
判りやすい説明ありがとうございました。
nagiseさん。

外部端末からアクセスし続けて、2日程経つと、サーバーのコミットチャージが600mbくらいから1300mb位に増えてしまい、重くなってしまいました。
そこで、メモリーを監視し始めたのですが、ちょっとずつメモリーが消費されていく感じでした。

問題の部分のウインドウを閉じると消費が止まったので、DWRの部分が原因だと思いました。

ですが、サーバーの物理メモリーも少ないので、そちらを増設して様子を見る事にします。

ありがとうございました。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-12-04 15:15
引用:

フジタさんの書き込み (2007-12-04 14:59) より:
そこで、メモリーを監視し始めたのですが、ちょっとずつメモリーが消費されていく感じでした。

問題の部分のウインドウを閉じると消費が止まったので、DWRの部分が原因だと思いました。

ですが、サーバーの物理メモリーも少ないので、そちらを増設して様子を見る事にします。



え?
結局VM内のメモリの使用量については計測しないの?
GCかけて減るかどうかは試したのですか?
DWRがリークしていると結論付けていいのだろうか…。

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