1

Web サイトで作成したゲームのハイスコアをホストする Java ベースのコマンドライン サーバーを実行しています。それは効率的かつ迅速に機能します。ただし、約 200MB の RAM を使用します。すべてを手動で無効にすることから System.gc() を呼び出すことまで、すべてを試しました

これは、ソケット接続から使用する入力ストリーム オブジェクトと出力ストリーム オブジェクトに関係があるのではないかと疑い始めています。プログラムを最初に実行したときに、通常の量の RAM を占有していることに気付きました。その後、接続が確立されると、100MB にジャンプし、接続ごとに増加し続けます。

編集: 私のクラスの 1 つで、すべての名前、スコア、タイムスタンプを 3 つの異なる ArrayLists に保持しています。ただし、jhat と jmap を使用して徹底的に調べたところ、これらを組み合わせても約 5MB の RAM しか使用しないことがわかりました。

これが漠然としていて誰にも答えられない場合は、質問してください。喜んでソース コードを提供します。

4

2 に答える 2

3

耐用年数を超えてオブジェクトへの参照を保持することにより、リークが発生する場合があります。

プロファイラーを入手し、それを使用して調査することをお勧めします。Java 6 で配布されている VisualVM プログラムから始めるとよいでしょう。

プロファイラーは、JVM にアタッチするか、プログラムの JVM をホストしてプログラムの実行を監視する個別のプログラムです。オブジェクトの割り当てとコードの実行を、統計的に、または実行中のコードを「計測」することによって追跡できます。オブジェクトが割り当てられていて解放されていないかどうかを示し、それらが何であるか、およびそれらが割り当てられた場所を表示できます (他の多くの便利なものの中でも)。

私は商用の jProfiler を使用しています (ただし、専門家にとっては価値があります)。前回検索したとき、無料で利用できる高品質のプロファイラーがいくつかありました (少なくとも個人的な使用であれば)。VisualVM には、基本的ではあるが便利なプロファイリング機能があります。私はそこから始めます (Windows では、JDK の bin ディレクトリにあります。Linux と Mac でも同じことが当てはまると思います)。

于 2011-02-05T04:15:43.773 に答える
0

jmap に続いて jhat などを使用して、メモリが実際にどのように使用されているかを確認してください。

Sun (Oracle) の JVM はメモリを解放して OS に戻すことはありません。そのため、メモリ使用量が単調に増加しても驚くことではありません。

于 2011-02-05T04:55:17.877 に答える