![](/img/trans.png)
[英]Kubernetes - java.lang.OutOfMemoryError: unable to create new native thread
[英]java.lang.OutOfMemoryError: unable to create new native thread
我看到這樣的評論
我已經看到這個問題的一個地方是如果你繼續創建線程,而不是調用start(),直接在線程對象上調用run()。 這將導致線程對象無法解除引用...所以在一段時間后,無法創建新的本機線程的消息出現
在我的應用程序中,我們最初計划使用線程,但后來我們決定不再需要了,所以我們只調用run()而不是start()。 我們是否需要為新的threadClass(..)做手動GC?
我的tomcat啟動設置
-Xms1024m -Xmx1024m -XX:MaxPermSize=450m
為什么要首先創建一個Thread
?
您的代碼應該實現Runnable
接口。
然后,當您決定要在線程中運行它時,使用Runnable
作為參數簡單地實例化一個Thread
,並在Thread
對象上調用start()
。
相反,如果您只想在當前線程中運行它,只需在Runnable
對象上調用run()
即可。
這有幾個好處:
Thread
對象 Runnable
,它在概念上更貼近:你不是在編寫一些特殊的Thread,對嗎? 您只需編寫一些可以執行/運行的代碼。 Executor
,進一步抽象決定 最后但並非最不重要的是,您避免了對是否創建本機線程資源的任何可能的混淆。
調用run()方法時,不應創建新線程。 當沒有引用垃圾收集器時,垃圾收集器會收集您的對象。
您的其他代碼部分可能會創建很多線程。
嘗試在代碼中使用ThreadPoolExecutor (線程池)來限制應用程序中的線程,並相應地調整線程池大小以獲得更好的性能。
您還可以檢查以下內容以調試您的問題:(從鏈接引用)如果遇到此異常,可以執行以下操作。
此鏈接很好地描述了JVM如何拋出此錯誤: http : //javaeesupportpatterns.blogspot.ro/2012/09/outofmemoryerror-unable-to-create-new.html
基本上它非常依賴於操作系統。 在RedHat Linux 6.5(很可能是其他發行版/版本和內核版本)上,max_threads = max_process x 2。
最大線程數非常依賴於允許進程的數量。 哪個進程的最大數量取決於您安裝的最大物理內存。
如果您查看limits.conf文件(在我的RHL 6.5上,它位於/etc/security/limits.d/90-nproc.conf中)。 執行文件:
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.
* soft nproc **1024**
root soft nproc unlimited
您會看到,對於非root用戶,它是1024(這意味着2048個最大線程)。
要查看允許用戶創建的最大線程數,請運行此命令“cat / proc / sys / kernel / threads-max”或“sysctl kernel.threads-max”。
要以root身份解決這樣的問題(至少它對我有用),你需要增加最大允許線程數:
echo 10000> / proc / sys / kernel / threads-max
這會影響所有用戶和root用戶。 用戶需要注銷然后再次登錄才能使設置生效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.