1. 程式人生 > >加密:每次New一個BouncyCastleProvider導致的記憶體洩漏

加密:每次New一個BouncyCastleProvider導致的記憶體洩漏

https://yq.aliyun.com/ziliao/240745

本文講的是每次New一個BouncyCastleProvider導致的記憶體洩漏, 問題原因 生產伺服器的記憶體一直升高,直到宕機。記憶體分析的結論是:記憶體洩漏。 下載dump檔案,經過解析堆疊日誌,如下圖所示: The class "javax.crypto.JceSecurity", loa

問題原因

生產伺服器的記憶體一直升高,直到宕機。記憶體分析的結論是:記憶體洩漏。 
下載dump檔案,經過解析堆疊日誌,如下圖所示:

每次New一個BouncyCastleProvider導致的記憶體洩漏

The class "javax.crypto.JceSecurity", loaded by "<system class loader>", occupies 2,522,379,928 (95.73%) bytes. The memory is accumulated in one instance of "java.lang.Object[]" loaded by "<system class loader>".Keywords java.lang.Object[] javax.crypto.JceSecurity

每次New一個BouncyCastleProvider導致的記憶體洩漏

是BouncyCastleProvider 這個類裡面的方法, 全是靜態的, new一個多一個, GC不回收, 慢慢就宕機。

dump程式碼如下: 
每次New一個BouncyCastleProvider導致的記憶體洩漏解決方案

private static org.bouncycastle.jce.provider.BouncyCastleProvider bouncyCastleProvider = null;
    public static synchronized org.bouncycastle.jce.provider.BouncyCastleProvider getInstance() {
        if (bouncyCastleProvider == null) {
            bouncyCastleProvider = new org.bouncycastle.jce.provider.BouncyCastleProvider();
        }
        return bouncyCastleProvider;
    }

KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA", getInstance());

 

記憶體洩漏分析工具參見:http://blog.csdn.net/shenhaiwen/article/details/54670234

以上是雲棲社群小編為您精心準備的的內容,在雲棲社群的部落格、問答、公眾號、人物、課程等欄目也有的相關內容,歡迎繼續使用右上角搜尋按鈕進行搜尋java , 記憶體洩露 oom ,以便於您獲取更多的相關知識。