質問

Webサイトで作成したゲームのハイスコアをホストするJavaベースのコマンドラインサーバーを実行しています。効率的かつ速く動作します。ただし、約200 MBのRAMを占有します!私はすべてを手動でnullingnulling out and callingSystem.gc()に至るまで、すべてを試しました

私は、これがソケット接続から使用する入力ストリームと出力ストリームオブジェクトと関係があるかもしれないと疑っています。プログラムを最初に実行したとき、通常の量のRAMを占めることに気付きました。その後、接続を取得すると、100MBにジャンプし、各接続に対して高くなり続けます。

編集:私のクラスの1つで、3つの異なる配列リストにすべての名前、スコア、タイムスタンプを保持しています。ただし、JHATとJMAPを使用した徹底的な検査では、合計で約5MBのRAMしか使用していません。

これがあいまいすぎて誰もが答えるにはあまりにも曖昧な場合は、尋ねてください。ソースコードを喜んで提供します。

役に立ちましたか?

解決

耐用年数を超えてオブジェクトへの参照を保持することによって引き起こされる漏れがあるかもしれません。

プロファイラーを入手し、それを使用して調査することをお勧めします。良い場所の開始は、Java 6に配布するVisualVMプログラムです。

プロファイラーは、JVMに接続するか、プログラムのJVMをホストし、プログラムの実行を監視する別のプログラムです。オブジェクトの割り当てとコード実行を追跡するか、統計的に、または実行するコードを「計装」することにより、追跡できます。オブジェクトが割り当てられてリリースされていないかどうかを示し、それらがどのオブジェクトであるか、どこに割り当てられたかを示すことができます(他の多くの有用なものの中でも)。

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

他のヒント

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

Sun(Oracle's)JVMはメモリをOSに戻すことはないので、メモリ使用量が単調に増加するのを見るのは驚くことではありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top