私たちのアプリは、Java とネイティブ コードを組み合わせたものです。そして、メモリリークします。
最も可能性の高い原因はネイティブ コードであり、実際にはリークのシェアがありますが、唯一の原因ではないようです。
とにかく、ローカルで行った OpenJDK 6 のビルドを使用して、ネイティブ プロファイラーでアプリをプロファイリングします。したがって、Java 自体の完全なソースと完全なシンボルがあります。
方法論は単純です。アプリを実行し、ある時点で正常に終了するように通知します。グレースフル ターミネーションには、次の 3 つの手順が含まれます。
- クリーンアップするようにネイティブ コードに信号を送ります。
- http サーバーの停止 (Restlet + Simple)
- System.exit(0) の呼び出し
どうやら、Java は、占めていたメモリを解放するために OS に大きく依存しているようです。これは、メモリを予約するために VirtualAlloc が何度も呼び出されていることがわかりますが、予約が解除されることは決してないためです。
しかし、これは単なる例です。コミットされた解放されていないメモリが大量にあり、OS が解放するために意図的に残されたものとリークとは何かを判断する方法はありません。さて、私は Java を責めません。これらのリークは、私たちが何か間違ったことをした結果かもしれません。私は知らない。
重要な注意事項です。プロセスの存続期間中のクリーンアップについて話しているのではありません。それを扱うSOに関する質問があり、それらのどれも私のものとは関係ありません。終了時に Java をクリーンアップして、実際にどれだけのメモリがリークしているかを確認したいと考えています。
では、この事後分析リーク分析を実行可能にするために、終了時にクリーンアップするよう Java に指示する方法はありますか?