[英]Running a .jar on Apache server, but out of memory error
OutOfMemoryError: unable to create new native thread
意味着您沒有足夠的本機內存來生成線程。 注意,這與堆空間完全不同。
發生該錯誤的最典型情況是耗盡堆棧空間,地址空間或max user processes
。 幾乎所有情況都與創建過多線程有關。
ulimit -s
檢查Linux上的stack space
。 每個Java線程消耗一定數量的堆棧大小。 可以通過-Xss
或-XX:ThreadStackSize=...
進行配置-XX:ThreadStackSize=...
您可以通過java -XX:+PrintFlagsFinal -version | grep ThreadStackSize
檢查平台的默認堆棧大小。 java -XX:+PrintFlagsFinal -version | grep ThreadStackSize
。 如果您的應用程序確實需要深層堆棧,則可以通過減少ThreadStackSize
來壓縮更多線程,但代價是StackOverflowError
。 address space
是一個問題。 根據你的截圖,你正在使用32位JVM,所以你與4G總的地址空間的限制。 這包括所有東西(堆,非堆,堆棧,本機內存等)。 也就是說,分配給堆(-Xmx)的數量越多,可以創建的線程就越少。 解決方法是使用64位JVM或減小堆大小等。 ulimit -u
監視Linux上的max user processes
。 如果您有1000個進程的“默認”限制,則可以輕松實現這一目標,因為每個線程都計入該限制AFAIK。 那里的解決方案是增加限制。 通常,您可能希望添加-XX:+HeapDumpOnOutOfMemoryError
,收集堆轉儲並檢查使用的線程數。 如果線程數是合理的(例如,少於100個),則您要檢查配置(上面的1-3)。 如果線程數太瘋狂(例如,超過100個),則可能需要查找缺陷並進行修復。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.