cyj86

          Java加載dll,導致Java進程內存泄露

          By zhaoch

          在做網絡監控系統性能測試時,出現了內存泄露的問題,困擾了很久,現在終于算是解決了,但是根本原因尚不明確,拿出來大家討論下,看看能不能完美解決~

          這個問題奇怪的地方在于是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頭文件則不會引起內存泄漏


          目前此問題的根本原因尚不明確,懷疑是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-13 11:45 薛定諤的貓 閱讀(1791) 評論(4)  編輯  收藏 所屬分類: 典型、疑難問題

          Feedback

          # re: Java加載dll,導致Java進程內存泄露 2011-06-13 18:40 楓子

          此段代碼所做的工作就是加載一個dllhttp://www.imfeng.com/  回復  更多評論   

          # re: Java加載dll,導致Java進程內存泄露 2011-06-15 13:29 懶人助手

          加載一個dll文章,也看看http://www.lrtool.net  回復  更多評論   

          # re: Java加載dll,導致Java進程內存泄露 2011-06-16 14:49 writegull

          學習了。不錯  回復  更多評論   

          # re: Java加載dll,導致Java進程內存泄露 2011-06-30 22:41 FlyingFly

          在MSDN看到一篇討論,看上去就跟你的問題類似。

          可能這個問題并不是java 通過jni loadlibrary的問題, 你可以試試通過C#Code load 這個dll 然后 開多個thread 是不是也有類似的問題。

          Memory leaks creating threads after loading LoadLibrary

          http://social.msdn.microsoft.com/Forums/en-US/vclanguage/thread/3bb5f18d-5484-4240-9b55-18dd50d02859/  回復  更多評論   


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 丹棱县| 瑞昌市| 玉田县| 武义县| 溧阳市| 刚察县| 乐陵市| 绥棱县| 巴南区| 大连市| 兖州市| 灵石县| 顺昌县| 汝南县| 巴中市| 元谋县| 九龙县| 浏阳市| 康定县| 蕉岭县| 龙口市| 怀远县| 巴彦淖尔市| 滕州市| 土默特左旗| 股票| 桐梓县| 慈溪市| 贡山| 龙岩市| 班玛县| 光泽县| 蒲江县| 肇东市| 湖北省| 太白县| 西青区| 东乡县| 囊谦县| 西乌珠穆沁旗| 福泉市|