2009-12-07 62 views
0

最近我創建了一個基於Maven的web項目,並使用Tomcat作爲應用服務器調試......在tomcat服務器中運行應用程序有什麼問題?

但直接從項目上下文菜單中運行應用程序後,Tomcat是經常死(pergem錯誤,這意味着從memery的)。

最糟糕的是它創建了很多空閒線程,並且它們都不能通過手動方式被殺死。

而且tomcat的狀態也不能被NetBeans檢測到,所以不能停止和重啓。 我必須重新啓動系統才能清理它們。

我的系統是Fedora 12 x86 ... Java版本是SUN JDK 6更新17. NetBeans版本是6.7.1。

我試圖創建一個關於此的錯誤,但NetBeans開發人員拒絕了它......我非常驚訝,這是使用NetBeans開發Web應用程序的一大阻礙。

今天我在最新的NetBeans 6.8rc1中使用了JBoss 5.1,並且也遇到了同樣的問題... 我試過調整VM參數並分配更多的內存但沒有影響。

我已經通過seam ant build腳本部署了幾個seam樣本到JBoss 5.1,並且沒有問題。 但我切換到使用NetBeans來執行此操作,由於內存不足而失敗。

什麼是錯?

+0

你試圖調整VM參數,但它成功的一個小的不便?嘗試調用Runtime.getRuntime()。maxMemory(),並查看是否已將您的設置考慮在內 – Bozho 2009-12-07 06:40:29

+0

Runtime.getRuntime()。maxMemory()在此處不相關。 PermGen空間用於保存代碼和相關數據,這些數據不可能是GC'd。在開發條件下反覆取消部署和重新部署的Web容器是一種特殊情況,因此您需要分配更多的PermGen(特別是!),或者需要啓用類的GC。 – 2012-10-23 05:22:00

+0

檢查JRebel的不支持當前的配置,也許可以解決你的問題:http://www.zeroturnaround.com/jrebel/ – penguintux 2009-12-07 09:59:39

回答

4

(我假設你正在談論空閒線程應用程序的線程。如果你談論的是Tomcat的工作線程,那麼他們應該不會造成PermGen的問題在空閒時)。

我試着創建一個關於此的錯誤,但NetBeans開發人員拒絕了它...我很驚訝...

我很不驚訝。這不是一個真正的NetBeans問題。它甚至不是真正的Tomcat或JBoss問題。

空閒/孤立應用程序線程的問題是,您無法安全地終止正在運行的JVM中的線程。沒有能力做到這一點,你不能阻止(在這種情況下)permgen空間泄漏。這實質上是一個Java平臺問題。它只能在JVM支持由JSR 121定義的隔離機制時才能解決。

但是,假設您的問題與進行熱部署有關,它不僅僅是您必須擔心的空閒應用程序線程。如果有任何任何可訪問的實例,您將重新部署,這將導致原始的舊類加載器和它加載的所有類保持可及。

...這是使用NetBeans開發Web應用程序的一大阻礙。

解決方案是不時重新啓動Web容器。這將清理閒置螺紋和其他殘餘物並釋放泄漏的殘餘空間。你可以通過運行一個更大的堆和更多的permgen來改善它,但是你不能讓它消失,特別是如果一些孤線程不是空閒的......

哦,是啊,也不會出現大的嬰兒!這是不是作秀塞,它只是:-)

+0

雖然我通常與你缺乏驚喜的認同,它真的有一點做的閒置線程。 相反,它與類沒有關係,默認情況下是垃圾收集。如果你真的想支付額外的GC工作的價格,你可以啓用垃圾收集類。一般來說,你不會希望在生產服務器上這樣做,而且我個人而言,我寧願不時地重新啓動Tomcat(並且將最大permgen空間設置得足夠高以至於「不時」不會太頻繁。 – 2012-10-23 05:15:03

+0

線程只有進入它,如果他們實際運行的用戶代碼,從而保護其免受GC,即使啓用的GC類和如果是這樣的情況下,用戶有一個壞的應用程序;這不是如何J2EE應用程序應該工作。 – 2012-10-23 05:16:08

+0

在生產服務器上,你只需要在代碼足夠PermGen的空間和實際使用相關的數據。它不會繼續增長。你們看到的是衝擊要麼部署大量的演示代碼。,或重複部署提高你的PermGen空間會幫助你無論哪種方式 – 2012-10-23 05:17:54

相關問題