2017-07-19 107 views
3

我們有一個Java應用程序,計劃每5分鐘運行一次作業。在這個工作,存在安全組件,是否每次執行時間如下:在Java應用程序中多次添加安全提供程序

java.security.Security 
      .addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); 

我的問題是:

  1. 需要它的安全提供多次在應用程序中添加?它有什麼用途?對我來說,這是沒有意義的,添加一次就足夠了。
  2. 它是應用程序中潛在內存泄漏的候選者嗎?

爲了澄清,我想以編程方式在我的應用程序中添加Bouncy Castle安全提供程序,而不是通過JRE靜態添加。國際海事組織,在應用程序中添加一次Bouncy Castle安全提供商就足夠了,我不需要多次。

回答

4

根據addProvider's javadoc

返回:
優先位置,其中加入的供應商,或-1 如果不加入供應商,因爲它已經安裝

addProvider已經檢查是否安裝了提供程序,因此即使您在應用程序中有多個調用,也只會添加一次。添加完成後,它將一直保留到JVM停止狀態(或者有人呼叫removeProvider)。

當然,您可以對它進行優化並在主類中放置一個調用(某些類,您知道它始終在應用程序啓動時加載),但我不擔心這一點。

我曾經在不同部分有不止一次調用addProvider的系統(因爲它們可以以任何順序調用並且彼此獨立),它們都運行在相同的JVM中,並且它從來沒有任何內存泄漏。當然,這只是我的情況,但我不知道這會導致泄漏。


如果你想打電話addProvider只有當供應商尚未加入,您可以撥打Security.getProvider()檢查。如果提供者不在JVM中,則返回null

// add provider only if it's not in the JVM 
if (Security.getProvider(BouncyCastleProvider.PROVIDER_NAME) == null) { 
    Security.addProvider(new BouncyCastleProvider()); 
} 
相關問題