1. 程式人生 > >Java web 服務啟動時Xss溢位異常處理筆記

Java web 服務啟動時Xss溢位異常處理筆記

本文來自網易雲社群

作者:王飛

錯誤日誌

錯誤日誌要仔細看,第一行不一定就是關鍵點,這個錯誤出現的時候,比較靠後,其中關鍵行就是下面這句。

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]

問題找到了,那如何解決呢?

網上給出了一些解決辦法,大致可以分為以下幾種,我也嘗試了一下。

方法一 調整Xss引數

Xss是什麼呢?它是用來設定每個執行緒的堆疊大小。JDK5.0以後每個執行緒堆疊大小為1M,以前每個執行緒堆疊大小為256K。更具應用的執行緒所需記憶體大小進行調整。在相同實體記憶體下,減小這個值能生成更多的執行緒。但是作業系統對一個程序內的執行緒數還是有限制的,不能無限生成,經驗值在3000~5000左右。

把這引數設定的更大,如-Xss10M,問題解決。

NDP部署系統中,設定jvm的引數位置在“釋出配置”->“jvmExtra”欄位中,填上重新發布即可生效。

當前這裡我沒有去嘗試設定到最小是多大可以解決問題,因為這種解決方式雖然你能用,但並不合理。因為這樣設定以後,服務中每啟動一個執行緒,就會佔用所設定的大小,在記憶體充裕的情況可以偷懶著,這麼做。另外一個原因是這個問題出現在我的一個元件包內,這麼做的話,會讓後期其它元件包啟動的服務都需要去手動設定這個值,於是我們嘗試去看看jar包有沒有問題?

方法二 檢查jar包是否有問題

看到有人說升級jar至最新版本可以解決問題,不過很可惜,我引用的進來的jar已經是最新版本,無法升級。

但我再檢視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啟動檢查

因為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+款雲產品!

更多網易研發、產品、運營經驗分享請訪問網易雲社群