Javaはdllをロードして、Javaプロセスのメモリの漏洩を招きます


By zhaoch
ネットワークモニタリングシステムの性能テストをする时、メモリの漏れの问题が现れて、长い间困って、今やっと解决しましたが、根本的な原因はまだはっきりしていません.出してみんなで讨论して、完璧に解决できるかどうか见てみましょう.
この問題の奇妙な点は、Javaプロセスのメモリ漏洩であり、通常のJVMメモリ漏洩ではなく、Jprofileなどのツールでも問題点が見えないことです.
テストコードは次のとおりです.

System.loadLibrary("test1");

int threadPoolSize = 400;
ExecutorService service = Executors.newFixedThreadPool(threadPoolSize);

for (int i = 0; i < 400; i++) {
service.submit(new Runnable() {
public void run() {
while (true) {
try {
Thread t = new Thread();
t.start();
Thread.sleep(100);
} catch (Exception e) {
e.printStackTrace();
}
}
}
});
}

説明:このコードの作業はdllをロードし、スレッドを絶えず起動することです(スレッドは何もせず、直接終了します).
注意:スレッドプールは、問題の再現を加速させるためだけで、他の用途はありません.
現象:
1.dllをロードしないと、スレッドが絶えず起動し、Javaプロセスのメモリは正常で、ずっと増加しません.
2.添付ファイルのtest 1のdllをロードすると、Javaプロセスのメモリは常に増加します.
3.添付ファイルのtest 2のdll(C++実行環境vcredist_x 86をインストールする必要がある)をロードした場合、Javaプロセスのメモリは正常で、増加しません.
dllの説明:
dllのエンジニアリングソースは添付ファイルにあり、test 1とtest 2の違いは、添付ファイル:test 1が「標準Windowsライブラリを使用」または「静的ライブラリでMFCを使用」を選択し、test 2が「共有DLLでMFCを使用」を選択した場合のコンパイルオプションにすぎない.
このdllエンジニアリングの特徴はjniを使用し、mfcヘッダファイル[#include]を導入し、mfcヘッダファイルを導入しないとメモリ漏れを起こさないことです.
この問題の根本的な原因はまだ明らかではありませんが、jdkのバグ(最新のjdk 1.6.0.23を使っても始まらない)の疑いがありますが、皆さんは何か考えがありますか?皆さんの討論を歓迎します~
[img]http://dl.iteye.com/upload/attachment/501315/c57e6073-ae55-3761-9e61-c396ea0d9cce.png[/img]