- - PR -
配列を返すためのDWRの使い方が悪いのか、メモリがリークする件。
1|2|3
次のページへ»
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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; } | ||||
|
投稿日時: 2007-12-04 11:25
メモリ使用量(プロセスサイズ?)や、ヒープ使用量が増えることは問題ではありません。
ガベージコレクションが行われても減らないとすると問題ですが。 | ||||
|
投稿日時: 2007-12-04 13:06
メモリ使用量ってのは何で確認していますか?
VMが使うメモリ量とVM上で動くJavaアプリケーションが使うメモリ量の区別はついていますか? DWR(Direct Web Remotingと思われる)は使ったことないのでよく分かりませんが もしリークがあるのであれば、バグパレードなどに情報があるかもしれません。 | ||||
|
投稿日時: 2007-12-04 13:36
返信ありがとうございます。
インギさん JAVAは自動的に使われなくなったオブジェクトをガベージコレクションにより整理すると思いますが、メモリがリークするのはどのような時なのですか? 今回のようなグローバル変数で比較的大きめな配列を2秒間隔で呼び出していった場合、はメモリ的には増えて行ってしまうのでしょうか? public String[][] real_time_data() { String[][] stringArray = new String[10][20]; return stringArray; } 実際には増えてしまっているのですけど。。 | ||||
|
投稿日時: 2007-12-04 13:52
返信ありがとうございます。NAGISEさん。
>>メモリ使用量ってのは何で確認していますか? windows タスクマネージャ の中で、プロセス欄にある TOMCAT5,EXE は 257000k httpd.EXE が 54891k っで こっちが増えていきます。 >>VMが使うメモリ量との区別はついていますか? 申し訳ありませんが、VM上で動くJavaアプリケーションが使うメモリ量 は httpd.EXE(アパッチ)が使うメモリ量に含まれているのでは無いのでしょうか? そのように考えていましたが、 今回の件は、アパッチ と TOMCAT を連携して 外部のブラウザでwebアプリケーションを起動しています。 この場合、TOMCAT上でプログラムが動いていて、そのメモリーは増加していないので アパッチの方に問題があるのでしょうか? | ||||
|
投稿日時: 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-12-04 14:59
判りやすい説明ありがとうございました。
nagiseさん。 外部端末からアクセスし続けて、2日程経つと、サーバーのコミットチャージが600mbくらいから1300mb位に増えてしまい、重くなってしまいました。 そこで、メモリーを監視し始めたのですが、ちょっとずつメモリーが消費されていく感じでした。 問題の部分のウインドウを閉じると消費が止まったので、DWRの部分が原因だと思いました。 ですが、サーバーの物理メモリーも少ないので、そちらを増設して様子を見る事にします。 ありがとうございました。 | ||||
|
投稿日時: 2007-12-04 15:15
え? 結局VM内のメモリの使用量については計測しないの? GCかけて減るかどうかは試したのですか? DWRがリークしていると結論付けていいのだろうか…。 |
1|2|3
次のページへ»