2010-06-28 55 views
4

我有一個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。

回答

3

我相信,默認最大內存池 爲64MB,而我當時正在接近64 這些過程。所以這將是 4GB全部告訴...在32位 限制。

不需要。32位限制是每個進程(至少在64位操作系統上)。但default maximum heap is not fixed at 64MB

初始堆尺寸:的 機器的物理存儲器1/64的 機或一些合理的最小上更大。

最大堆大小:小1/4的 物理內存或1GB。

注意:爲J2SE 5.0提供的堆大小的邊界和分數是正確的。隨着計算機功能越來越強大,它們在後續版本中可能會有所不同。

+0

啊,是的,謝謝你,我正在回憶起1.4的舊限制。是的,我知道這個限制是按流程進行的,但我在抓秸稈。 – 2010-06-28 20:57:50

1

我懷疑內存是零散的。還請檢查Tools to view/solve Windows XP memory fragmentation以確認內存碎片可能導致此類錯誤。

+0

對不起,但我沒有看到任何問題,可以確認內存碎片會導致此問題。實際上,http://stackoverflow.com/questions/171205/java-maximum-memory-on-windows-xp似乎表明內存只需要在JVM本身的地址空間內連續進行......如果我錯了,你說得對,我有什麼想法來證實這一點? – 2010-06-28 21:33:21

相關問題