2011-02-10 56 views
0

有沒有辦法讓Java進程fork或者啓動另一個Java進程,並使用共享內存來儘量減少RAM的使用?減少Solaris上多個Java進程的內存佔用(UNIX)

爲了讓人們在不影響其他人的情況下安全地殺人,將會有很多進程。此外,這將允許簡單檢測哪些線程正在使用更多的內存或CPU,如果它們在單獨的進程中。這應該允許任何進程在不影響其他進程的情況下發生崩潰或OutOfMemoryError。

如果我們可以同時運行100-300個java進程,每個進程都有自己的目的,那將會很不錯。我意識到,如果我們要避免從數據庫和文件系統中搶奪太多內存,我們可能不得不限制這個數量並要求進程承擔多個角色。

編輯:
我想我說當我說共享內存不正確的含義。我的意思是隻能在多個進程中使用的內存,例如Java類(而不是變量)。如果可能的話,所有的java包和庫都可以重用。

+1

http://download.oracle.com/javase/1.5.0/docs/guide/vm/class-data-sharing.html – Xailor 2011-02-11 00:29:26

+0

謝謝,這似乎是我正在尋找。請移至答案,以便我可以接受。 @Xepoch – 2011-02-24 17:48:56

回答

0

@George Baily - 剛剛發現了上面的評論。

是的,新的JVMs共享類文本,但據我瞭解,它只在客戶端(非服務器)的JVMs。這樣做的好處是減少了IO和啓動時間,但在幫助減小佔用空間方面還有額外的好處。

你可以在這裏閱讀更多:

http://download.oracle.com/javase/1.5.0/docs/guide/vm/class-data-sharing.html

您可能還需要得到堆上調整參數,以允許更小的體積侵略性。雖然是半商業化的,但我維護一個小型軟件包,可管理多個(數百個)JVM的工作負載,並動態管理OS級別的IO和進程優先級,以實現工作負載目標。 JVM的窮人WLM。因爲能夠在運行時管理JVM人機工程學,所以我一直未能成功,但WLM方法的出色表現非常出色。讓我知道你是否想要更多信息。

0

共享內存是什麼意思?你在談論主機系統的內存嗎?

由於您使用的是Solaris,Java線程是Solaris線程,並且每個線程都有自己的進程。但Java仍然在您提供的JVM內存參數下運行。如果出現OutOfMemoryError,則JVM的內存池已達到其限制,而不是主機系統。換句話說,在Java中,你永遠不會真的訪問共享內存 - 這是JVM的工作。如果您的Java進程需要更多內存,則必須提高JVM的內存限制。但是所有內存都由JVM管理。爲了真正訪問共享內存,您需要使用JNI離開JVM並進入主機的內存。

如果你正在談論JVM啓動另一個JVM,我想這是可能的,但是你談論的是多個JVM,並且爲了最大限度地減少RAM的使用,應該給每個JVM一個非常小的初始內存池用。否則,你會有一堆JVM爲他們的虛擬內存模型以及相關的線程佔用內存。

+0

這是一個JVM啓動另一個時的情況。我指的是Java內核或任何在父進程和子進程中保持相同的內容,或者最初是相同的,但稍後可能會將某些段複製到處理特定空間(如果需要更改)。我不知道我在說什麼。我只是想嘗試儘可能減少內存使用量。我知道我必須鎖定`-Xmx`以保持合理。但是,類存儲(而不是變量)的東西,如MySQL連接器,所有的java包; Java郵件,PDF生成器。這些通常會在多個進程中使用。 – 2011-02-11 00:00:07

0

不,這是不可能的,據我所知。這有幾個原因:

  1. 共享對象的所有權將是一個可疑的事情,所以每個線程的內存限制將無法執行。
  2. 如果一個線程死亡,這是一個嚴重的問題。線程不會像這樣意外死掉,如果你安裝了一個catch-all異常處理程序。線程在一個寫得好的系統中無意中死掉的唯一原因是拋出了一個Error,這意味着系統不穩定,並且通常也意味着VM應該儘快停止。
  3. 拋開一些非常特殊的情況(尤其是app/webservers)任何系統都不可能在丟失其某個線程後繼續運行。往往這會產生可怕的後果。

更新:已經發現,這是一個網絡服務器是需要一個解決方案,我會盡量走得更遠一點。儘管Java的設計並不是像您所需的那樣高度隔離。一些功能可以通過JVMTI代理來實現。具體而言,線程可以是stopped,objects reachable by a thread can be checkedquery the time used up by each thread等。壞消息是你的代理將不得不用C語言或類似的語言編寫,它非常難以調試,任何錯誤都可能導致虛擬機崩潰。

+0

這是一個webapp服務器。一些webapps會在生產環境中經常更改。因此,不可避免的會由於錯誤的代碼而導致無限循環和內存溢出。如果發生這種情況,它將不得不與其他線程隔離 - 我希望這隻能通過分離進程才能完全實現。如果有必要,無限循環的進程中的現有線程可以完成,並且Web服務器可以知道不應該啓動(請求)該進程上的任何新線程。不要因爲寫一個新的網絡服務器而嘲笑我。它已經很好地思考過了。 – 2011-02-10 23:57:46