0

全て、

時間の経過とともにますます多くのメモリを消費し始めるJavaメモリプロセスがあります。ヒープスペースの使用量に上限を設けるために、-Xmxオプションを512Mに設定しました。ある期間にわたってゆっくりとプロセスメモリ使用量が2GBに達しました。

MATやYOURKITなどのさまざまなツールを使用して、メモリリークの可能性についてコードを分析しましたが、Javaコードでそのようなリークの可能性は見つかりませんでした。このコードは、リークのないように見えるOneNative関数も使用しています。

次の質問があります。

  1. Javaプロセスが使用できる合計メモリに上限を設けることは可能ですか?
  2. ヒープ以外のJVMの他のメモリ使用量は何ですか?
  3. LinuxはWindowsの「ワーキングセット」メモリモデルで動作しますか?プロセスがバックグラウンドに置かれると、そのメモリが解放されます。
  4. 512Mで-Xmxオプションを使用した後でも、ヒープ使用量が増加した場合、JVMは「メモリ不足」をスローしないはずです。これにより、ヒープスペース以外の何かによってメモリがリークされているのではないかと思われます。メモリダンプから、ヒープメモリが増加していないようです。

答えてくれてありがとう。

4

3 に答える 3

5

メモリ使用量をどのように測定していますか?

通常、3種類のメモリ使用量があります。

  • VIRT-仮想メモリサイズ(KiB)タスクによって使用される仮想メモリの合計量。これには、すべてのコード、データ、共有ライブラリに加えて、スワップアウトされたページとマップされたが使用されていないページが含まれます。
  • RES-常駐メモリサイズ(KiB)タスクが使用したスワップされていない物理メモリ。
  • SHR-共有メモリサイズ(KiB)他のプロセスと共有される可能性のあるメモリを反映しているだけです。

仮想メモリのサイズは、-Xmxで指定したサイズよりも大きくなる可能性があります(数GB)が、害はありません。RESとSHRはあなたが見なければならないものです。

ヒープとは別に、-Xmx(permgen)の影響を受けない別のクラスのメモリ使用量があります。しかし、それは通常、数MBに制限されています。HotSpotGCチューニングガイドを読むことをお勧めします。

于 2012-09-24T07:38:11.333 に答える
1

Java アプリケーションでメモリ リークが疑われる場合は、必ずPlumbrを試してください。それは非常に優れており、それらを発見し、非常に有用なレポートを提供します.

于 2012-10-01T13:02:39.833 に答える
1

私の「コメント」を本格的な「応答」で補強しましょう。

多くの文字列操作を行っている場合は、「String」クラスを絶対に使用しないでください。Java には、問題をインテリジェントに分析できる優れたツール (JConsole を含むがこれに限定されない) が多数用意されています。あなたの 2 つの新しいBFFは次のようになります。

  • StringBuilder (文字列を効率的に操作) および

  • JConsole (ヒープ割り当てやガベージ コレクションなど、プログラムの動作を調べます)。

そして、user643011 が正しく指摘したように、おそらく「リーク」する可能性のあるものが他にもたくさんあります。ファイルが閉じられていない、多くのスレッドが多くのスタックスペースを使用しているなどです。

ここにもう1つの良いリンクがあります:

于 2012-09-24T19:59:52.853 に答える