2009-06-29 116 views
10

我很好奇是否有任何類似於.Net的AppDomain的Java抽象。Java AppDomain喜歡抽象嗎?

特別是,我很好奇,因爲我發現我們的Coldfusion/J2EE服務器每隔幾天就需要重啓一次,因爲內存泄漏很慢,我們還無法輕鬆追蹤。這可能會破壞我們長期運行的流程,並且我們真的很想要一種緩慢的方式,即在人們超過特定時間段/內存閾值時,將人員推送到新的JVM。

從我有限的.Net體驗中,我確信這是IIS和AppDomain能夠通過回收受到內存壓力的AppDomain進行無縫管理的一種情況。請讓我知道,如果我在這種情況下AppDomains的幫助。

有什麼建議嗎?

回答

10

我想在這裏接受的答案是有點誤導。簡單地說「不,你不能」不是全部。問題的焦點是卸載服務器進程中的Java類,以便在不重新啓動進程的情況下從JVM進程中移除泄漏代碼。 OP並沒有要求AppDomain提供的類似進程的內存隔離功能,而是能夠在正在運行的JVM中卸載類。我說類似流程,因爲在底層,AppDomain不是一個進程,而是享有操作系統提供的一流進程的一些隔離方面。所提到的隔離JSR是指這種「類似進程」的隔離。卸載Java ClassLoaders以及類,而不用循環託管JVM的OS進程是可能的。這裏提到了幾種方法:SO 148681。在Java中做這件事不是微不足道的,也不是很優雅,但它是可能的。

+0

你是對的。感謝您的迴應。 – 2009-09-13 05:22:42

0

根據時間或特定標準(如增長的內存消耗和內存使用率)回收單個JVM,這是我使用的WebSphere Application Server高級版本的一項功能。如果您的應用服務器沒有這種功能,那麼製作一些shell腳本來提供類似這樣的功能應該是可行的。

這個工作很好地假設:

a)。來自用戶的請求被噴灑在更大的一組JVM上。 b)。所有請求都是無狀態的,或者有一些狀態複製功能。複製是WebSphere和WebLogic的一項功能,我猜測其他應用程序服務器也具有這種能力。

在這樣的環境中,不需要「慢慢」將人員移動到其他服務器。我們只需要知道,我們可以安全地停止任何一個服務/ JVM,並且這些會話將在另一個實例中啓動。

+0

感謝您的評論。不幸的是,我的網絡應用程序目前都不是無狀態的,因爲會話不可序列化,所以複製是不可能的。也許我最好的做法是讓所有內容都可序列化。 – 2009-06-29 16:10:43

8

不幸的是,沒有。

Java世界中類似的概念是Isolate,它在JSR 121中首次出現。這是一個未來JVM特性的API,它允許在同一個JVM中運行的不同應用程序之間進行安全的分離和通信。 JSR發佈後(2004年左右),Sun的一個研究團隊在巴塞羅那項目中工作。該項目試圖在Sun的HotSpot 1.5 VM中實施隔離API。兩年後,他們發佈了SPARC/Solaris的原型。由於穩定性問題,Windows/Linux版本從未發佈。

最近,SUN向J2ME推出了隔離API的有限版本,重點是在沒有主動提供它們的環境中提供「多進程」。最近,我們還向Sun詢問了他們在將Isolate API應用於標準JVM方面的狀態,他們的迴應是他們計劃通過有限的支持發佈JVM。他們計劃提供加載/卸載孤立但無法在它們之間進行通信的能力。另外,還有一個老的研究人員構建了一個名爲JanosVM(java 1.1)的兼容JVM版本,但我懷疑它現在可以用於任何用途。

希望這有助於...

+0

謝謝!這真的很有趣和信息! – 2009-07-17 14:51:56