在做網絡監控系統 的性能 測試 時,出現了內存 泄露的問題,困擾了很久,現在終于算是解決了,但是根本原因尚不明確,拿出來大家討論下,看看能不能完美解決~
這個問題奇怪的地方在于是Java 進程內存泄露,而不是平常的JVM內存泄露,用Jprofile等工具 也無法看出問題所在。
測試代碼 如下:
1 System.loadLibrary( " test1 " );
2
3 int threadPoolSize = 400 ;
4 ExecutorService service = Executors.newFixedThreadPool(threadPoolSize);
5
6 for ( int i = 0 ; i < 400 ; i ++ ) {
7 service.submit( new Runnable() {
8 public void run() {
9 while ( true ) {
10 try {
11 Thread t = new Thread();
12 t.start();
13 Thread.sleep( 100 );
14 } catch (Exception e) {
15 e.printStackTrace();
16 }
17 }
18 }
19 });
20 }
說明:此段代碼所做的工作就是加載一個dll,然后不斷的啟動線程(線程什么也不做,直接終止)。
注:線程池只是為了加速問題復現,無其他用處。
現象:
1.如果不加載dll,只不斷的啟動線程,Java進程內存正常,不會一直增長。
2.如果加載附件中test1的dll,Java進程內存會一直增長。
集裝箱運費3.如果加載附件中test2的dll(需要安裝C++運行環境vcredist_x86),Java進程內存正常,不會一直增長。
dll說明:
dll的工程源碼在附件中,test1和test2的區別只在于編譯選項,如附件:test1選擇的是“使用標準Windows 庫”或“在靜態庫中使用MFC”,test2選擇的是“在共享DLL中使用MFC”
此dll工程的特點在于使用了jni,并引入了mfc頭文件 【#include <afxwin.h>】,如果不引入mfc頭文件則不會引起內存泄漏
WiiU中文站目前此問題的根本原因尚不明確,懷疑是jdk的bug (使用最新的jdk1.6.0.23也沒用),不知道大家有什么想法嗎?歡迎大家討論~
/Files/cyj86/dll工程.rar
/Files/cyj86/test1.rar
/Files/cyj86/test2.rar
/Files/cyj86/vcredist_x86.rar
/Files/cyj86/opt.png
posted on 2011-06-16 09:55
墻頭草 閱讀(757)
評論(0) 編輯 收藏