本文來自網易雲社區java
做者:王飛nginx
錯誤日誌要仔細看,第一行不必定就是關鍵點,這個錯誤出現的時候,比較靠後,其中關鍵行就是下面這句。web
Caused by: java.lang.IllegalStateException: Unable to complete the scan for annotations for web application [] due to a StackOverflowError. Possible root causes include a too low setting for -Xss and illegal cyclic inheritance dependencies. The class hierarchy being processed was [org.bouncycastle.asn1.ASN1EncodableVector->org.bouncycastle.asn1.DEREncodableVector->org.bouncycastle.asn1.ASN1EncodableVector]
網上給出了一些解決辦法,大體能夠分爲如下幾種,我也嘗試了一下。django
Xss是什麼呢?它是用來設置每一個線程的堆棧大小。JDK5.0之後每一個線程堆棧大小爲1M,之前每一個線程堆棧大小爲256K。更具應用的線程所需內存大小進行調整。在相同物理內存下,減少這個值能生成更多的線程。可是操做系統對一個進程內的線程數仍是有限制的,不能無限生成,經驗值在3000~5000左右。tomcat
把這參數設置的更大,如-Xss10M,問題解決。app
NDP部署系統中,設置jvm的參數位置在「發佈配置」->「jvmExtra」字段中,填上從新發布便可生效。jvm
當前這裏我沒有去嘗試設置到最小是多大能夠解決問題,由於這種解決方式雖然你能用,但並不合理。由於這樣設置之後,服務中每啓動一個線程,就會佔用所設置的大小,在內存充裕的狀況能夠偷懶着,這麼作。另一個緣由是這個問題出如今個人一個組件包內,這麼作的話,會讓後期其它組件包啓動的服務都須要去手動設置這個值,因而咱們嘗試去看看jar包有沒有問題?maven
看到有人說升級jar至最新版本能夠解決問題,不過很惋惜,我引用的進來的jar已是最新版本,沒法升級。spa
但我再查看jar的時候發現,項目中引用了兩個版本的jar包文件呢,因而猜想多是jar包衝突致使的。嘗試maven打包中排除加載舊版本的jar,保留一個jar包版本。操作系統
重啓成功。
排除某一個jar中引用的某個jar文件方法以下:
<dependency> <groupId>com.xxx.xxx</groupId> <artifactId>commons-utils</artifactId> <version>0.17.5</version> <exclusions> <exclusion> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> </exclusion> </exclusions></dependency>
由於tomcat啓動會去掃描jar包,看錯誤信息org.bouncycastle.asn1.ASN1EncodableVector,是出在這個類
這個類出如今bcprov*.jar這個包
因此在tomcat的conf目錄裏面catalina.properties的文件,
在tomcat.util.scan.DefaultJarScanner.jarsToSkip=裏面加上bcprov*.jar過濾
啓動不會報錯了,這個方法沒有嘗試,由於NDP部署是不支持配置該功能的,不適合個人業務場景。
Xss溢出的緣由,多半是jar問題,因此儘量的查找jar是否出錯,而不是去經過設置Xss的大小或者去tomcat的設置跳過檢查,都不是真正的經過問題根本緣由去解決bug。
固然經過方案二沒法確認jar包問題的話,可能首選的仍是方案三,不過方案三在NDP部署時沒法設置,那麼最後能夠考慮方案一。
網易雲免費體驗館,0成本體驗20+款雲產品!
更多網易研發、產品、運營經驗分享請訪問網易雲社區。
相關文章:
【推薦】 django項目在uwsgi+nginx上部署遇到的坑
【推薦】 Kylin存儲和查詢的分片問題