1. ホーム
  2. java

Javaのメモリ使用量を監視する方法は?

2023-10-26 04:45:51

質問

Jboss 上で動作する j2ee アプリケーションがあり、そのメモリ使用量を監視したいと考えています。現在、私たちは次のコードを使用しています。

    System.gc();
    Runtime rt = Runtime.getRuntime();
    long usedMB = (rt.totalMemory() - rt.freeMemory()) / 1024 / 1024;
    logger.information(this, "memory usage" + usedMB);

このコードは正常に動作します。つまり、現実に対応したメモリカーブを示しています。DBから大きなxmlファイルを作成するとき、曲線は上昇し、抽出が終了した後、曲線は下降します。

あるコンサルタントが、gc()を明示的に呼び出すのは間違っている、gcをいつ実行するかはjvmに決めさせればいい、と言いました。基本的に、彼の主張は以下のものと同じでした。 ここで議論されている . しかし、私はまだ理解していない。

  • メモリ使用量を曲線化するにはどうすればよいのでしょうか。
  • 明示的な gc() の何が問題なのでしょうか? 私は、明示的な gc() で起こりうる小さなパフォーマンスの問題には関心がなく、それは 1-3% と見積もられます。私が必要とするのは、顧客サイトでの私たちのシステムの分析に役立つメモリとスレッドのモニターです。

どのように解決するのですか?

VM メモリで何が起こっているかを実際に確認したい場合、次のような優れたツールを使用する必要があります。 VisualVM . これはフリーソフトウェアで、何が起こっているのかを見るのに素晴らしい方法です。

何も本当に "wrong" が明示されているわけではありません。 gc() を呼び出すことについては、特に問題はありません。しかし gc() を呼び出したとき、あなたはガベージコレクタが実行されることを提案しているのです。そのコマンドを実行した正確な時間にガベージコレクタが実行されるという保証はありません。