- - PR -
オブジェクトの生成について
1
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-06-16 12:02
Struts(Linux,TOMCAT+APACHE,ORACLE 10g)で開発をしています。
時々固まったように動かなくなるのでtopコマンドで調べてみたらjavaというプロセスのRSSが80Mになっていました。 起動直後は47Mですがテストを繰り返すうちに少しずつ増えています。 固まってしまうのはごく稀になのでその間ずっとウオッチすることもできず直接の原因が判らず困っています。(DBの排他が外れないせいではないかと思っていますが調査中です) 原因を解明する上で今回教えていただきたいのは、Actionクラスでオブジェクトを生成(New)しても問題ないのかということです。 書籍のサンプルではActionクラスでオブジェクトを生成(New)してセッション変数として登録していたのでそれにならっていますが、このようにした場合、このオブジェクトはいつ破棄されるのでしょうか? newしたオブジェクトはTOMCATを再起動するとかセッションがタイムアウトするとかのタイミングまでどんどん溜まってしまうような気がするのですが? | ||||||||||||
|
投稿日時: 2005-06-16 12:36
なんでもセッションに格納すればよいというわけではありません。
オブジェクトのライフサイクルを考慮したうえで、 適切なスコープに格納するべきです。
これって、動くようにするには再起動など行っているのでしょうか? (全くうんともすんとも言わない状態) それとも放置すれば動くようになっているのでしょうか? 固まったままの状態でスレッドダンプを行えば、 どのスレッドが停止しているのかわかると思います。 スワップで時間がかかり過ぎるとか、JavaVM自体の問題で停止するということもありますが、 作り手の問題が殆どです。DBのデッドロックや、 スレッドのデッドロック・無限ループなどを疑ってみましょう。
セッションがタイムアウトすれば、参照されなくなりますからGCの対象になります。 (セッションのみで参照しているなら) GCの対象になったところでGCが即時に行われるわけではないので気を付けてください。
どのような問題について懸念しているのかよくわかりません。 | ||||||||||||
|
投稿日時: 2005-06-16 15:11
表示したい項目のリストを格納しています。 ページ制御があるので対象データをListにしてすべて格納していて、表示したいページはそのオフセットを持ちまわって決めています。 対象データはユーザごとに絞りこみができるようになっています。 毎回必要なデータだけを取り出すような作りの方がいいのかもしれませんが、まずはサンプルをそのままにしています。
詳しく調べたわけではありませんが、固まったタイミングが更新系の処理でバグが見つかった直後だったりしたのでDBの排他が解除されなかったのではないかと考えています。 5分ほど待ってみて復旧しなかったので再起動してましたので、今度同じ事象がでた時にはスレッドダンプに挑戦して見たいと思います。
Actionクラスで生成したオブジェクトはいつまでたっても解放されないのではないかと懸念していました。 ちなみにsetAttributeで設定したオブジェクトは保存しておく必要があるのでしょうか? もしsetAttributeでオブジェクトがコピーされるなら元のオブジェクトは必要ないと思いますが。 | ||||||||||||
|
投稿日時: 2005-06-16 15:40
「Actionクラスで生成したオブジェクト」は具体的にはどのようなオブジェクトですか? 「setAttibute」とはどのクラスのメソッドのことですか? 「オブジェクトのコピー」とはどのような処理を指していますか? これだけ見ると、JavaのGCの仕組みについて根本的に理解されていないように思います。 | ||||||||||||
|
投稿日時: 2005-06-16 19:44
セッション数や同時アクセス数などによって、適切なチューニングが必要になってきます。 メモリが問題になっている場合などは、検索結果を持ちまわすのではなく アクセス単位で必要部分を取得するなどの工夫も必要です。 こういうのは、用件定義レベルで見えてくる部分だと思います。 設計時点で適切な方法を選ぶべきですね。
Actionクラスだろうが、通常のJavaオブジェクトであろうが、 作成したインスタンスに対して参照を持つ限り存在し続けますし、 参照がなければGCの対象になります。 またインスタンスを生成したら、メモリが確保され領域に対する参照が返されます。 setAttributeで渡すのは生成したインスタンスの参照です。 Javaではインスタンスの値渡しの概念は存在しません。 参照の概念をもう少々勉強してみたほうがいいでしょう。 | ||||||||||||
|
投稿日時: 2005-06-17 11:51
JAVAについては勉強を始めたばかりなので他の言語と混同しているところがありました。
少しずつ理解を深めたいと思います。 |
1