• ベストアンサー

Javaサーバアプリケーションのメモリ節約

Javaでサーバアプリを作成しました。 そのサーバアプリはクライアントがサーバに 接続して、ちゃっとや対戦ゲームができるプログラムです。 プログラムは2000行程度あるので、 サンプルとして、以下のようなプログラムだと 考えていただければと思います。 http://www.techscore.com/tech/Java/Network/3.html 起動すると、以下のようなメモリ使用量になります。 起動した直後なため、ソケットがクライアントの接続を待っている状態です。 クライアントが接続すると、%MEMも以下の値よりも徐々に増えていきます。 # ps -eo "pid,ppid,%mem,cmd" PID PPID %MEM CMD 18816 1 4.1 java server -server 18817 18816 4.1 java server -server 18818 -18825 18817 4.1 java server -server 18816が親プロセス、18817-18825が子プロセス 合計で10プロセスがあるわけです。 ということはメモリ使用率は4.1*10=41%も使っているのでしょうか? それとも親子合わせて、4.1%の使用率なのでしょうか? JavaはCに比べてメモリ使用量が大きいとは聞いたことありますが、節約する方法は何かないのでしょうか? また、子プロセスが9つもあがるのが無駄なような気がします。 子プロセスの数を制御する方法はないのでしょうか? どこかのホームページの紹介でも、結構なので、 ご教授いただければ幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

私もメモリ管理には悩まされました・・・ 話が違うかもしれませんが、お許しください。 私はStringの使い方を変えました。 例えば、 2つのStringを連結するような場合、 String a = "hoge"; String b = "rake"; String c = a + b; と書いてしまいがちです。 (少なくても私はこのように書いてしまいました) しかし、StringBufferを使うとメモリをあまり食わずにすみます。 上記2つのStringを連結する場合 StringBuffer buf = new StringBuffer("hoge"); buf.append("rake"); String a = buf.toString(); Stringを2つ連結しようとすると、 3つのオブジェクト(連結対象、被連結対象、連結結果)を生成する必要があります。 しかし、StringBufferを使うと2つのオブジェクトで済みます。

kyoui7
質問者

お礼

ありがとうございます。 StringとStringBufferの使い方について調べてみたら http://www.afis.to/~start/Visitor/kousokuka.html 上記のようなページを見つけました。 作成したプログラムの文字列変数は全てStringを使っているため、見なおしてみようと思います。

その他の回答 (1)

  • covachan
  • ベストアンサー率38% (46/120)
回答No.2

>子プロセスの数を制御する方法はないのでしょうか? プログラムの中でプロセスを生成していないのであればそれはきっとサーブレットの方で制御できると思います。 メモリはそんなに切迫しているのでしょうか? 41%であれば問題はないと思いますし、JAVAでは一般的にそれくらいは使用されます。 メモリだけで考えるのであればHOT-JAVAをやめれば使用メモリは少なくなります。ですが、別段問題がないのであればsusumufireさんが回答されているようにプログラムの中で考慮すれば大丈夫だと思いますよ。

kyoui7
質問者

お礼

ありがとうございます。 プログラムの中で子プロセスは生成していません。 accept()を使うと、クライアントを待ちうけるために、 9つ子プロセスをあげる仕様なのかもしれません・・ HOT-JAVAは使っても使わなくても、あまり変わらず40%程度消費してしまいます。 また、クライアントが増えると徐々に消費が増えて80%程度までメモリ消費しています。 80%になっても、サーバダウンするといったことは起きてはいません。 しかし、さすがに80%という数字を見ると、なんらかの有効な対処を行えればと考えています。 なお、PCの物理メモリは192M、SWAP160Mです。 ←基礎情報なのに、最初に書き忘れてました、すいません。

関連するQ&A