1

私たちのアプリは、Java とネイティブ コードを組み合わせたものです。そして、メモリリークします。

最も可能性の高い原因はネイティブ コードであり、実際にはリークのシェアがありますが、唯一の原因ではないようです。

とにかく、ローカルで行った OpenJDK 6 のビルドを使用して、ネイティブ プロファイラーでアプリをプロファイリングします。したがって、Java 自体の完全なソースと完全なシンボルがあります。

方法論は単純です。アプリを実行し、ある時点で正常に終了するように通知します。グレースフル ターミネーションには、次の 3 つの手順が含まれます。

  1. クリーンアップするようにネイティブ コードに信号を送ります。
  2. http サーバーの停止 (Restlet + Simple)
  3. System.exit(0) の呼び出し

どうやら、Java は、占めていたメモリを解放するために OS に大きく依存しているようです。これは、メモリを予約するために VirtualAlloc が何度も呼び出されていることがわかりますが、予約が解除されることは決してないためです。

しかし、これは単なる例です。コミットされた解放されていないメモリが大量にあり、OS が解放するために意図的に残されたものとリークとは何かを判断する方法はありません。さて、私は Java を責めません。これらのリークは、私たちが何か間違ったことをした結果かもしれません。私は知らない。

重要な注意事項です。プロセスの存続期間中のクリーンアップについて話しているのではありません。それを扱うSOに関する質問があり、それらのどれも私のものとは関係ありません。終了時に Java をクリーンアップして、実際にどれだけのメモリがリークしているかを確認したいと考えています。

では、この事後分析リーク分析を実行可能にするために、終了時にクリーンアップするよう Java に指示する方法はありますか?

4

1 に答える 1

0

優れたJavaプロファイラー(YourKitやJProfilerなど)は、参照を保持することによってJavaオブジェクトをリークしている場合、まっすぐに教えてくれます。これにより、JNI以外のリークに関する質問に答えることができます。

JNIリークの場合(そして私は経験から書いています)、ネイティブコードをJavaの外部でテストできることを確認する必要があります。これにより、Java固有のリンケージの可能性が小さくなり、注意深く対処できます。読む。またはラバーダックと話しています。

于 2012-12-29T14:39:03.353 に答える