diff -r 687fd7c7986d src/share/classes/javax/crypto/JceSecurity.java
--- a/src/share/classes/javax/crypto/JceSecurity.java	Tue Mar 04 11:51:53 2014 -0800
+++ b/src/share/classes/javax/crypto/JceSecurity.java	Thu Oct 20 12:34:46 2016 -0400
@@ -54,15 +54,15 @@
     private static CryptoPermissions defaultPolicy = null;
     private static CryptoPermissions exemptPolicy = null;
 
-    // Map<Provider,?> of the providers we already have verified
+    // Map<Class,?> of the providers we already have verified
     // value == PROVIDER_VERIFIED is successfully verified
     // value is failure cause Exception in error case
-    private final static Map<Provider, Object> verificationResults =
-            new IdentityHashMap<>();
+    private final static Map<Class<? extends Provider>, Object>
+        verificationResults = new WeakHashMap<>();
 
-    // Map<Provider,?> of the providers currently being verified
-    private final static Map<Provider, Object> verifyingProviders =
-            new IdentityHashMap<>();
+    // Map<Class,?> of the providers currently being verified
+    private final static Map<Class<? extends Provider>, Object>
+        verifyingProviders = new HashMap<>();
 
     // Set the default value. May be changed in the static initializer.
     private static boolean isRestricted = true;
@@ -169,29 +169,30 @@
      * Return null if ok, failure Exception if verification failed.
      */
     static synchronized Exception getVerificationResult(Provider p) {
-        Object o = verificationResults.get(p);
+        Class<? extends Provider> c = p.getClass();
+        Object o = verificationResults.get(c);
         if (o == PROVIDER_VERIFIED) {
             return null;
         } else if (o != null) {
             return (Exception)o;
         }
-        if (verifyingProviders.get(p) != null) {
+        if (verifyingProviders.get(c) != null) {
             // this method is static synchronized, must be recursion
             // return failure now but do not save the result
             return new NoSuchProviderException("Recursion during verification");
         }
         try {
-            verifyingProviders.put(p, Boolean.FALSE);
-            URL providerURL = getCodeBase(p.getClass());
+            verifyingProviders.put(c, Boolean.FALSE);
+            URL providerURL = getCodeBase(c);
             verifyProviderJar(providerURL);
             // Verified ok, cache result
-            verificationResults.put(p, PROVIDER_VERIFIED);
+            verificationResults.put(c, PROVIDER_VERIFIED);
             return null;
         } catch (Exception e) {
-            verificationResults.put(p, e);
+            verificationResults.put(c, e);
             return e;
         } finally {
-            verifyingProviders.remove(p);
+            verifyingProviders.remove(c);
         }
     }
 
