我有一個Solaris sparc(64位)服務器,它有16 GB的內存。有很多小型Java進程正在運行,但是今天我嘗試啓動一個新的時候出現了「無法爲對象堆預留足夠的空間」錯誤。我很驚訝,因爲服務器上仍然有4GB以上的空閒空間。新流程能夠在一些其他流程關閉後成功啓動;該系統肯定已經達到某種上限。64位操作系統上的32位Java:JVM的數量是否有限制?
在網絡搜索解釋之後,我開始懷疑它是否與我使用32位JVM(這個服務器上的所有java進程都不需要太多內存)有關。
我相信默認的最大內存池是64MB,並且我正在運行接近64個這些進程。因此,這將是4GB的所有告訴......在32位的限制。但我不明白爲什麼或者如何這些過程會受到其他過程的影響。如果我是對的,那麼爲了運行更多這些進程,我必須調整最大堆低於默認值,否則切換到使用64位JVM(這可能意味着提高最大堆要高於這些過程的默認值)。我並不反對這些,但我不想浪費時間,現在它仍然是黑暗中的一個鏡頭。
任何人都可以解釋爲什麼它可能以這種方式工作嗎?或者我完全錯誤?
如果我對這個解釋是正確的,那麼可能有這方面的文檔:我非常想找到它。 (我運行Sun的JDK 6更新17如果該事項。)
編輯:我完全錯了。下面的答案證實了我的直覺,我沒有理由不能運行儘可能多的JVM。稍後,我在嘗試運行非java進程的同一臺服務器上出現錯誤:「fork:沒有足夠的空間」。所以,我遇到了一些其他限制,這不是特定於Java的。我必須弄清楚它是什麼(不,它不是交換空間)。很可能,我去了serverfault。
啊,是的,謝謝你,我正在回憶起1.4的舊限制。是的,我知道這個限制是按流程進行的,但我在抓秸稈。 – 2010-06-28 20:57:50