解决OutOfMemoryError: unable to create new native thread问题
java.lang.OutOfMemoryError共有8種類型,其中java.lang.OutOfMemoryError: unable to create new native thread是很常見的一種,這類錯誤通常發生在應用試圖創建新線程時。
?
可能原因
1. 系統內存耗盡,無法為新線程分配內存
2. 創建線程數超過了操作系統的限制
解決方案
1. 排查應用是否創建了過多的線程
通過jstack確定應用創建了多少線程?超量創建的線程的堆棧信息是怎樣的?誰創建了這些線程?一旦明確了這些問題,便很容易解決。
2. 調整操作系統線程數閾值
操作系統會限制進程允許創建的線程數,使用ulimit -u命令查看限制。某些服務器上此閾值設置的過小,比如1024。一旦應用創建超過1024個線程,就會遇到java.lang.OutOfMemoryError: unable to create new native thread問題。如果是這種情況,可以調大操作系統線程數閾值。
3. 增加機器內存
如果上述兩項未能排除問題,可能是正常增長的業務確實需要更多內存來創建更多線程。如果是這種情況,增加機器內存。
4. 減小堆內存
一個老司機也經常忽略的非常重要的知識點:線程不在堆內存上創建,線程在堆內存之外的內存上創建。所以如果分配了堆內存之后只剩下很少的可用內存,依然可能遇到java.lang.OutOfMemoryError: unable to create new native thread。考慮如下場景:系統總內存6G,堆內存分配了5G,永久代512M。在這種情況下,JVM占用了5.5G內存,系統進程、其他用戶進程和線程將共用剩下的0.5G內存,很有可能沒有足夠的可用內存創建新的線程。如果是這種情況,考慮減小堆內存。
5. 減少進程數
這和減小堆內存原理相似。考慮如下場景:系統總內存32G,java進程數5個,每個進程的堆內存6G。在這種情況下,java進程總共占用30G內存,僅剩下2G內存用于系統進程、其他用戶進程和線程,很有可能沒有足夠的可用內存創建新的線程。如果是這種情況,考慮減少每臺機器上的進程數。
6. 減小線程棧大小
線程會占用內存,如果每個線程都占用更多內存,整體上將消耗更多的內存。每個線程默認占用內存大小取決于JVM實現。可以利用-Xss參數限制線程內存大小,降低總內存消耗。例如,JVM默認每個線程占用1M內存,應用有500個線程,那么將消耗500M內存空間。如果實際上256K內存足夠線程正常運行,配置-Xss256k,那么500個線程將只需要消耗125M內存。(注意,如果-Xss設置的過低,將會產生java.lang.StackOverflowError錯誤)
?
參考
https://blog.fastthread.io/2016/07/06/troubleshoot-outofmemoryerror-unable-to-create-new-native-thread/
總結
以上是生活随笔為你收集整理的解决OutOfMemoryError: unable to create new native thread问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 人工智能编程插件
- 下一篇: 割双眼皮后畏光什么时候恢复