啟動flink專案報錯java.lang.OutOfMemoryError: unable to create new native thread
一、問題:
啟動flink專案失敗,日誌異常:java.lang.OutOfMemoryError: unable to create new native thread
二、解決辦法:
1、 關於這個問題,一開始猜想是因訊息佇列(activemq)引起的,因為處理資料較多,開啟的執行緒數較多導致,因此對MQ搭建了叢集。
MQ叢集搭建方法:http://blog.csdn.net/jiangxuchen/article/details/8004561
但是搭建集群后發現,並沒有什麼卵用,問題依舊。
繼續......
2、 接下來懷疑是系統裡開的執行緒數太多,在優化後,問題仍然存在。
繼續......
3、 記憶體調優,減小xss值、JVM記憶體,仍然解決不了。
繼續......
4、 幾番周測,在整理思路後,決定首要任務就是如何重現該問題,於是編寫測試程式,測試出作業系統最大能夠建立的執行緒數:
1 import java.util.concurrent.CountDownLatch; 2 3 public class TestNativeOutOfMemoryError { 4 5 public static void main(String[] args) { 6 7 for (int i = 0;; i++) { 8 System.out.println("i = " + i); 9 new Thread(new HoldThread()).start(); 10 } 11 } 12 13 } 14 15 class HoldThread extends Thread { 16 CountDownLatch cdl = new CountDownLatch(1); 17 18 public HoldThread() { 19 this.setDaemon(true); 20 } 21 22 public void run() { 23 try { 24 cdl.await(); 25 } catch (InterruptedException e) { 26 } 27 } 28 }
執行後:
i = 982
Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:597)
at TestNativeOutOfMemoryError.main(TestNativeOutOfMemoryError.java:20)
問題重現,在反覆執行幾次後發現,生產系統最大隻能建立980多個執行緒,生產系統作業系統64位centeros,jdk1.7,64G記憶體。而我本地PC電腦都可以建立2500左右。
感覺原因快找到了,切換到執行賬戶使用命令:
$ su bigdata
$ ulimit -u
$ 1024
生產上所有程式都是在bigdata賬戶下執行,於是檢視該賬戶下所有的執行緒數總和為950,也即是說,隨時都可能會超過1024,導致記憶體溢位。檢視看程序當前執行的執行緒數命令為:pstree-p5516 |wc-l
注:5516是TaskManagerRunner 的PID
原因找到,作業系統對執行程式的賬戶有最大執行緒數限制。
$ vim /etc/security/limits.d/90-nproc.conf
開啟後發現除了root,其他賬戶都限制在1024個。
於是增加一條:bigdata soft nproc 20000
為什麼設定為20000,因為測試後發現,在執行到35000左右,系統就報記憶體溢位了,作業系統所有命令都不能使用,因此將程式最大執行緒數限制在20000。
修改後再沒出現記憶體溢位錯誤。問題解決。
三、思考
1、經過總結,在遇到問題後,不能盲目的到處修改,首先要做的就是重現問題,順藤摸瓜,逐步的找出根本原因。
2、關於tomcat記憶體調優,個人認為只有在中大型系統才需要調優或者伺服器硬體條件一般的情況下才需要調優,才能有所效果。
轉載:https://www.cnblogs.com/myshare/p/5177135.html