• ベストアンサー

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つもあがるのが無駄なような気がします。 子プロセスの数を制御する方法はないのでしょうか? どこかのホームページの紹介でも、結構なので、 ご教授いただければ幸いです。

  • Java
  • 回答数2
  • ありがとう数3

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

  • ベストアンサー
回答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

  • javaのプロセス起動について

    UNIXで例えば以下のようなコマンドでjavaのプロセスを停止するとします。 ps -eo pid,comm | awk '$2=="java" {print "kill -9" $1}' 逆にjavaのプロセスをコマンドで起動する方法はありますか?

  • JAVAのいろいろ

    こんばんわ。 サーバサイドのサーブレットとJSP、 クライアントサイドのJAVAアプレットとJAVAスクリプト、 JAVA初心者で、これからプログラムを勉強してシステム構築していきたいのですが、どの組み合わせが一番容易でわかりやすいでしょうか? 作成したいシステムは以下のMr.camのようなライブカメラです。 <http://www.tvdo.net/>

    • ベストアンサー
    • Java
  • レンタルサーバでJAVAを起動させられませんか?

    JAVAアプリケーションをサーバに置き、クライアント側のJAVAアプレットと通信させたいのですが、レンタルサーバにFTPでJAVAアプリケーションをアップしましたが、起動させられません。 レンタルサーバで提供されているSSHでサーバにログインしましたが、「>JAVA アプリケーション名」では「command not found」のようなことを言われてしまいます。 何か方法はないのでしょうか? よろしくお願いします。

  • JAVAで作るプログラムとは

    HPに使うJAVAスクリプトの勉強をしたく、JAVAとスクリプトは違う事を知らずにJAVAの通信教育を申し込んでしまいました。 JAVAはサーバー側のプログラミング言語で、 スクリプトはクライアント側のスクリプト言語でブラウザ上で動作する。 申し込んだものは仕方ないので頑張ってJAVAを理解したいと思うのですが、 ネット上のJAVA講座を見ると最初にJAVAをインストールするとあります。 これはJAVAを作成するソフトのようなものですか? JAVAで作るプログラムとはOSのようなものですか? JAVAでプログラムを作ってHPの更新やスクリプトが作成できるのですか? そもそもJAVAで作るプログラムとはどのように利用するのか、 プログラムの意味がよく分かりません。 JAVAとスクリプトの違いはもう良いのでプログラムについて 分かりやすく教えてください。

    • ベストアンサー
    • Java
  • サーバからクライアントにポート番号を指定する方法

    java初心者です。 現在javaを使ってサーバとクライアントのsocketプログラムを作っています。 動作としてはサーバ側がクライアントに対して接続するポートを指定し、以後クライアントがサーバに対して通信を行う際には指定されたポート番号を使って通信を行うような動作をさせたいのですがうまくいきません。 そのため、みなさんの知恵を拝借したいのですが、アドバイス等頂けないでしょうか。 また、javaでは実現不可能だとするのでしたら、その理由も詳しく教えていただけると幸いです。 どうぞよろしくお願いします。

    • ベストアンサー
    • Java
  • JavaでMDB

    JavaからMDBへ接続するプログラムを作ろうと思っていますが、環境が特殊なので、1.可能なのか、2.どうすれば可能なのか、といった回答にしていただければ非常に助かります。ご存知の方、いらっしゃいましたら回答のほどよろしくお願いします。手持ちの参考書などにも載っておらず困っております。 1. PCはスタンドアロン。MDBファイルにJavaからアクセスするアプリケーションは開発可能でしょうか。Access本体が無くても大丈夫でしょうか。 1. 同じくスタンドアロン環境でクライアントはアプレットとし、パーソナルサーバーのようなサーバー機能を載せ、Servletを動かしMDBにアクセスするという形。 3. Javaアプリケーションから外部プログラム(Acrobat Readerなど)を呼び出してアプリケーション内に表示することは可能でしょうか。 以上、よろしくお願いします。

    • ベストアンサー
    • Java
  • logoutしたとき消えるプロセスは誰が消してるの?

    telnetなどでログインして プロセスを動作させて、ログアウトすると 動作させていたプロセスが消えるのですが、 誰がそのプロセスにシグナルを送っているのでしょうか? OSはsolarisを使っています。 シェルが子供を消しているのかと思ったのですが、 以下の動作をみるとそうでないみたいで・・ telnet .... $ $sh $sleep 10000 & 1234(←sleepのPID) $kill [shのPID] $ ps -eo pid,ppid,args | grep 1234 1234 1 sleep 1000 $exit telnet .... $ $ ps -eo pid,ppid,args | grep 1234 $ない

  • クライアントがJAVAを使えるかどうか調べる方法

    JAVAに関しては完全な初心者です。 クライアントがリモート認証サーバに認証される仕組みを構築しようとしています。認証サーバのJAVAのアプレット?のプログラムをクライアントダウンロードし、ブラウザ上でそのプログラムを実行し、認証サーバで認証、という仕組みを導入しようとしています。 このとき、 1.クライアントがJAVAを使えるかどうかを調べる方法はないでしょうか?(AcrobatReaderみたいになければダウンロード、みたいなイメージなのですが間違いでしょうか?) 2.そのサーバからのJAVAプログラムとクライアントのJAVAを動かすための環境と、バージョンが一致していないといけない、みたいなことはあるのでしょうか? 3.もし2があるのなら、クライアント側、サーバ側で気をつけないといけないことは何があるでしょうか?

    • ベストアンサー
    • Java
  • 英語のjavaはあるが日本語のjavaがない

    今使っているコンピューターには英語のJavaがインストールされているみたいです。 cmdでjavaと打つと英語ででてきます。また、javaで作られた日本語のプログラムなどを起動すると文字化けしてしまいます。 基本的にはいつも英語を使うのですが、日本語のjavaのプログラムを使う場合もあるんです。この場合、日本語のjavaをインストールすればいいんですか?すでに英語のがあるんですけど重ねていれて大丈夫なんでしょうか?

  • Javaで名前付きパイプ通信

    プラットフォームWindows 2003サーバー。 C++のexeプログラムとJavaプログラム。 名前付きパイプでのプロセス間通信をしたいと考えています。 C++側は問題ないと思いますが、Java側で対応できますか? java.ioパッケージ内にpipedWriter/pipedReaderクラスがあるようですが、名前指定等がないようです。 どうぞご教授ください。

専門家に質問してみよう