2013-05-22 30 views
0

我正在使用64G內存的遠程服務器上工作,我正在使用一個使用32位JVM的平臺,我所要做的就是創建多個JVM(大約500個)。發生什麼事情是,在創建190左右後,我得到來自Java的OOM錯誤,它說無法創建新的本地線程。每個JVM佔用大約20M的RAM,因此20 * 190大約爲4G。 那麼所有JVM使用的內存是否有限制?順便說一下,我在Linux中的進程限制大約是10000,並且/ proc/sys/kernel/pid_max中的限制是65000,並且我也沒有得到其他進程缺少資源的情況。另一點,改變堆大小也沒有幫助。有什麼想法嗎?是否有運行多個32位JVM的限制?

回答

1

您的問題與堆大小無關。它與您能夠創建的線程數有關。

當你運行一個JVM時,你有很多創建(和活動)的線程。我至少可以算出25個。例如,Timer任務,編譯器線程,Finalizer線程和GC線程都有線程。

除了SerialGC,每個垃圾收集器都會創建一個與您擁有的核心數量成正比的線程數,因此它可以對每個JVM的線程數量產生巨大影響。

有些事情要做:

  • 增加你的進程限制
  • 設置的最大線程數(-XX:ConcGCThreads=N-XX:ParallelGCThreads=N
  • 做一些線程轉儲檢查在JVM中的線程數和爲您的平臺推出正確的編號

更多JVM選項:http://jvm-options.tech.xebia.fr/

希望有所幫助!

相關問題