問題:
開發環境,之前一直正常,某天突然用tomcat啟動項目后時不時報如下錯誤:
java.lang.OutOfMemoryError: unable to create new native thread
環境介紹:
項目是用的 Eclipse+Tomcat + activeMQ
activeMQ用的本地的windows版本,黑窗口啟動。
具體這個錯誤的上面報出的大異常是 JMS Exception。
因為是用的 spring,所以MQ消息處理部分報錯都是先拋出 JMSException,然后往下看才是 內存溢出,不能創建本地線程。
具體顯示異常發生在 MQ接收消息的 監聽器中的: session.createConsumer(session.createQueue(queueName)) 以及 onMessage方法中。
嘗試解決無果:
因為 onMessage方法中用了多線程處理業務邏輯,所以一開始 主觀認為是 線程創建太多導致的,於是各種百度,找到的方法都是說
虛擬機內存配置等等。結果各種配置Eclipse都無效,很是郁悶。
嘗試解決正確分析:
然后和其他同事比較Eclipse等環境配置,首先確保配置一樣的情況下,還是一樣有問題。
分析:
出問題的部分代碼一直都未改動,之前整個辦公環境都是正常的,
現在同樣的代碼,同樣的環境配置,別人那還不出問題。
那就有可能是 和其他人不一樣的地方出的問題,想到MQ是用的自己本機的,報的錯誤也是MQ部分的,雖然是在Eclipse中報錯,但已經排除了Eclipse環境的問題,那么是不是本機的MQ有問題。
真正解決方法:
於是,關掉MQ,找到MQ的目錄,查看data目錄下的幾個log日志文件,發現里面果真都報錯了,於是清空data目錄下的所有東西,重新去bin目錄中啟動bat文件。
在Eclipse中重啟項目,問題解決了。
啟示:
1、大家說的不一定就是對的,百度說的不一定就全面准確,具體問題具體分析很重要。
2、遇到難以解決的問題,如果百度等通用方法無效,那么要回過頭仔細分析 報錯的異常提示,注意整個異常的提示,尤其是開頭部分,對提示中的多個點都進行分析嘗試往往能夠找到問題。
3、找問題還是用一步一步的逐個排除法來縮小范圍比較靠譜。【最好有明確的分析 排除 順序,先排除容易操作的】
4、除了Eclipse 和項目外,外部依賴的一些其它 小服務 也可能是產生問題的罪魁禍首。