簡體   English   中英

java.lang.OutOfMemoryError:無法創建新的本機線程

[英]java.lang.OutOfMemoryError: unable to create new native thread

我看到這樣的評論

我已經看到這個問題的一個地方是如果你繼續創建線程,而不是調用start(),直接在線程對象上調用run()。 這將導致線程對象無法解除引用...所以在一段時間后,無法創建新的本機線程的消息出現

Sun Java論壇上

在我的應用程序中,我們最初計划使用線程,但后來我們決定不再需要了,所以我們只調用run()而不是start()。 我們是否需要為新的threadClass(..)做手動GC?

我的tomcat啟動設置

-Xms1024m -Xmx1024m -XX:MaxPermSize=450m 

為什么要首先創建一個Thread

您的代碼應該實現Runnable接口。

然后,當您決定要在線程中運行它時,使用Runnable作為參數簡單地實例化一個Thread ,並在Thread對象上調用start()

相反,如果您只想在當前線程中運行它,只需在Runnable對象上調用run()即可。

這有幾個好處:

  • 只要您不關心單獨的線程,就不會涉及任何Thread對象
  • 你的代碼被包裝在一個Runnable ,它在概念上更貼近:你不是在編寫一些特殊的Thread,對嗎? 您只需編寫一些可以執行/運行的代碼。
  • 您可以輕松切換到使用Executor ,進一步抽象決定

最后但並非最不重要的是,您避免了對是否創建本機線程資源的任何可能的混淆。

調用run()方法時,不應創建新線程。 當沒有引用垃圾收集器時,垃圾收集器會收集您的對象。

您的其他代碼部分可能會創建很多線程。

嘗試在代碼中使用ThreadPoolExecutor (線程池)來限制應用程序中的線程,並相應地調整線程池大小以獲得更好的性能。

您還可以檢查以下內容以調試您的問題:(從鏈接引用)如果遇到此異常,可以執行以下操作。

  • 使用lsof -p PID命令(Unix平台)查看此進程有多少個活動線程。
  • 確定操作系統定義的每個進程是否存在最大線程數。 如果應用程序的限制太低,請嘗試提高每進程的線程限制。
  • 檢查應用程序代碼以確定是否存在創建線程或連接(例如LDAP連接)的代碼,而不是銷毀它們。 您可以轉儲Java線程以查看是否已創建過多的數字。
  • 如果發現應用程序打開的連接太多,請確保銷毀應用程序創建的任何線程。 企業應用程序(.ear)或Web應用程序(.war)在長時間運行的JVM下運行。 僅僅因為應用程序完成並不意味着JVM進程結束。 應用程序必須釋放它分配的任何資源。 另一種解決方案是應用程序使用線程池來管理所需的線程。

此鏈接很好地描述了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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM