0

しばらくウェブを検索した後、私はあなたに私の問題について助けを求めることにしました。

私のプログラムは、本当に大きなログファイルを分析する必要があります。それらは約100mbから2gbまでです。FileChannelのようなNIOクラスを使用してファイルを読みたい。

ファイルをメモリに保存したくありませんが、行をすぐに処理したいと思います。コードは機能します。

今私の問題:Eclipse MATプラグインでメモリ使用量を分析したところ、約18MBのデータが保存されていると表示されています(これは適切です)。しかし、WindowsのTaskManagerによると、JVMは約180MBを使用しています。

なぜなのか教えていただけますか?

FileChannelで読み取ったデータを保存したくないので、処理したいだけです。その後、チャンネルを閉鎖します-その場合、すべてのデータが削除されると思いましたか?

使用済みスペースがMATに表示され、使用済みスペースがTaskManagerに表示されることの違いについて、皆さんが私を助けてくれることを願っています。

4

1 に答える 1

1

MATは、プログラムによってアクティブに参照されているオブジェクトのみを表示します。JVMはそれよりも多くのメモリを使用します。

  • 独自のコード
  • 非オブジェクトデータ(クラス、コンパイルされたバイトコードなど)
  • 現在使用されていないが、すでに割り当てられているヒープスペース。

最後のケースはおそらく最も主要なケースです。コンピュータにある物理メモリの量に応じて、JVMはヒープのデフォルトの最大サイズを設定します。パフォーマンスを向上させるために、最小限のガベージコレクションアクティビティでその量までメモリを使用し続けます。つまり、参照されなくなったオブジェクトは、すぐにガベージコレクションされるのではなく、メモリに残り、使用されるメモリの総量が増加します。

その結果、JVMは通常、ヒープの一部としてシステムに割り当てたメモリを解放しません。これは、OS監視ユーティリティで使用済みメモリの異常な量として表示されます。

オブジェクトの割り当て/割り当て解除の割合が高いアプリケーションはさらに悪化します。1.8GBのメモリを使用するアプリケーションがありますが、実際には100MB未満しか必要ありません。ただし、最大ヒープサイズを120 MBに減らすと、実行時間がほぼ1桁長くなります。

于 2013-02-20T09:09:47.243 に答える