2015-09-23 114 views
0

我的應用程序同時使用RMI和JDBC與遠程系統和數據庫進行通信。雖然數據庫問題已經解決,但事實證明,RMI正在導致Tomcat 6檢測到某種形式的內存泄漏(我也嘗試過使用Tomcat 7並且我們遇到同樣的問題)。RMI/Tomcat 6內存泄漏

基本上,當我們啓動應用程序並且用戶在網頁中輸入信息時,RMI調用將被髮送到後端系統。如果我們停止/啓動或重新啓動應用程序,Tomcat Manager現在可以檢測到內存泄漏。如果我們啓動應用程序並且不進行RMI調用,我們可以開始/停止&整天重新啓動應用程序而沒有問題。

有誰知道需要做什麼來防止RMI調用在重新加載時導致WebappClassLoader中的內存泄漏,或者在Web服務器仍在運行時停止/啓動?

+0

tomcat的消息是什麼?是關於ThreadLocal的嗎? – ZhongYu

+0

不,就是這樣 - 日誌中沒有錯誤消息。但是,Tomcat Manager聲稱,如果在使用RMI調用的應用程序中執行某些操作後單擊「查找泄漏」按鈕,然後使用管理器重新加載/停止應用程序,則會發現泄漏。我可以在jvisualvm中看到確實創建了一個新的WebappClassLoader(上下文)。 – kvgeorge1

回答

0

我的應用程序同時使用RMI和JDBC與遠程系統和數據庫交談。雖然數據庫問題已經解決,但事實證明,RMI導致某種形式的內存泄漏被Tomcat 6檢測到......有誰知道需要做什麼來防止RMI調用在重新加載時導致WebappClassLoader中的內存泄漏或在網絡服務器仍在運行時停止/啓動?

RMI調用不會導致內存泄漏。除此之外,我有八個雄貓通過RMI大量進行交互,這些動物已經連續數月沒有任何泄露跡象。

+0

當我停止/啓動或重新加載應用程序時,如果我在此之後使用管理器檢查,Tomcat會發現內存泄漏。我使用jvisualvm對JVM進行了描述,罪魁禍首似乎是位於GC根目錄頂部的sun.rmi.transport.DGCClient。 您是否在網絡服務器運行時啓動/停止或重新加載應用程序,還是在部署後停止tomcat? – kvgeorge1

+0

我可以用Tomcat運行一次或兩次重新加載它,然後我必須重新啓動Tomcat。但這適用於湯姆說,做RMI也是如此。你將不得不在這裏提供適當的細節。什麼內存泄漏?你有什麼證據表明RMI參與?你的RMI代碼是什麼樣的? – EJP

+0

我不能自由地泄露代碼本身,但這就是爲什麼我說我們有內存泄漏。 Tomcat管理器聲稱,如果在使用RMI調用的應用程序中執行某些操作後單擊「查找泄漏」按鈕,然後使用管理器重新加載/停止應用程序,就會發現泄漏。我可以在jvisualvm中看到確實創建了一個新的WebappClassLoader(上下文)。 – kvgeorge1

0

DGCClient沒有清理任何與RMI相關的資源,需要等待超時才能觸發。由於容器試圖停止運行,但RMI資源懸而未決,根據Tomcat Manager的說法,這產生了內存泄漏,這種內存泄漏在DGC收集RMI資源後自行清理並糾正了內存泄漏情況。