You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2017/09/01 15:04:45 UTC
svn commit: r1806973 - in /tomcat/trunk:
java/org/apache/catalina/core/JreMemoryLeakPreventionListener.java
java/org/apache/tomcat/util/compat/Jre9Compat.java
java/org/apache/tomcat/util/compat/JreCompat.java webapps/docs/changelog.xml
Author: markt
Date: Fri Sep 1 15:04:45 2017
New Revision: 1806973
URL: http://svn.apache.org/viewvc?rev=1806973&view=rev
Log:
Java 9 allows us to be more selective with the JRE memory leak protection.
Modified:
tomcat/trunk/java/org/apache/catalina/core/JreMemoryLeakPreventionListener.java
tomcat/trunk/java/org/apache/tomcat/util/compat/Jre9Compat.java
tomcat/trunk/java/org/apache/tomcat/util/compat/JreCompat.java
tomcat/trunk/webapps/docs/changelog.xml
Modified: tomcat/trunk/java/org/apache/catalina/core/JreMemoryLeakPreventionListener.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/JreMemoryLeakPreventionListener.java?rev=1806973&r1=1806972&r2=1806973&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/JreMemoryLeakPreventionListener.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/JreMemoryLeakPreventionListener.java Fri Sep 1 15:04:45 2017
@@ -20,7 +20,6 @@ package org.apache.catalina.core;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
-import java.net.URL;
import java.net.URLConnection;
import java.sql.DriverManager;
import java.util.StringTokenizer;
@@ -288,19 +287,17 @@ public class JreMemoryLeakPreventionList
* - javax.xml.bind.JAXBContext.newInstance()
*
* https://bugs.openjdk.java.net/browse/JDK-8163449
+ *
+ * Java 9 onwards disables caching for JAR URLConnections
+ * Java 8 and earlier disables caching for all URLConnections
*/
// Set the default URL caching policy to not to cache
if (urlCacheProtection) {
try {
- // Doesn't matter that this JAR doesn't exist - just as
- // long as the URL is well-formed
- URL url = new URL("jar:file://dummy.jar!/");
- URLConnection uConn = url.openConnection();
- uConn.setDefaultUseCaches(false);
+ JreCompat.getInstance().disableCachingForJarUrlConnections();
} catch (IOException e) {
- log.error(sm.getString(
- "jreLeakListener.jarUrlConnCacheFail"), e);
+ log.error(sm.getString("jreLeakListener.jarUrlConnCacheFail"), e);
}
}
Modified: tomcat/trunk/java/org/apache/tomcat/util/compat/Jre9Compat.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/compat/Jre9Compat.java?rev=1806973&r1=1806972&r2=1806973&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/compat/Jre9Compat.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/compat/Jre9Compat.java Fri Sep 1 15:04:45 2017
@@ -16,8 +16,10 @@
*/
package org.apache.tomcat.util.compat;
+import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
+import java.net.URLConnection;
import javax.net.ssl.SSLEngine;
import javax.net.ssl.SSLParameters;
@@ -27,16 +29,19 @@ class Jre9Compat extends JreCompat {
private static final Class<?> inaccessibleObjectExceptionClazz;
private static final Method setApplicationProtocolsMethod;
private static final Method getApplicationProtocolMethod;
+ private static final Method setDefaultUseCaches;
static {
Class<?> c1 = null;
Method m2 = null;
Method m3 = null;
+ Method m4 = null;
try {
c1 = Class.forName("java.lang.reflect.InaccessibleObjectException");
m2 = SSLParameters.class.getMethod("setApplicationProtocols", String[].class);
m3 = SSLEngine.class.getMethod("getApplicationProtocol");
+ m4 = URLConnection.class.getMethod("setDefaultUseCaches", String.class, boolean.class);
} catch (SecurityException | NoSuchMethodException e) {
// Should never happen
} catch (ClassNotFoundException e) {
@@ -45,6 +50,7 @@ class Jre9Compat extends JreCompat {
inaccessibleObjectExceptionClazz = c1;
setApplicationProtocolsMethod = m2;
getApplicationProtocolMethod = m3;
+ setDefaultUseCaches = m4;
}
@@ -80,5 +86,15 @@ class Jre9Compat extends JreCompat {
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
throw new UnsupportedOperationException(e);
}
+ }
+
+
+ @Override
+ public void disableCachingForJarUrlConnections() throws IOException {
+ try {
+ setDefaultUseCaches.invoke(null, "JAR", Boolean.FALSE);
+ } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
+ throw new UnsupportedOperationException(e);
+ }
}
}
Modified: tomcat/trunk/java/org/apache/tomcat/util/compat/JreCompat.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/compat/JreCompat.java?rev=1806973&r1=1806972&r2=1806973&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/compat/JreCompat.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/compat/JreCompat.java Fri Sep 1 15:04:45 2017
@@ -16,6 +16,10 @@
*/
package org.apache.tomcat.util.compat;
+import java.io.IOException;
+import java.net.URL;
+import java.net.URLConnection;
+
import javax.net.ssl.SSLEngine;
import javax.net.ssl.SSLParameters;
@@ -96,4 +100,19 @@ public class JreCompat {
public String getApplicationProtocol(SSLEngine sslEngine) {
throw new UnsupportedOperationException(sm.getString("jreCompat.noApplicationProtocol"));
}
+
+
+ /**
+ * Disables caching for JAR URL connections. For Java 8 and earlier, this also disables
+ * caching for ALL URL connections.
+ *
+ * @throws IOException If a dummy JAR URLConnection can not be created
+ */
+ public void disableCachingForJarUrlConnections() throws IOException {
+ // Doesn't matter that this JAR doesn't exist - just as
+ // long as the URL is well-formed
+ URL url = new URL("jar:file://dummy.jar!/");
+ URLConnection uConn = url.openConnection();
+ uConn.setDefaultUseCaches(false);
+ }
}
Modified: tomcat/trunk/webapps/docs/changelog.xml
URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1806973&r1=1806972&r2=1806973&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Fri Sep 1 15:04:45 2017
@@ -70,6 +70,13 @@
running under a <code>SecurityManager</code> and using
<code>Subject.doAs()</code>. (markt)
</fix>
+ <add>
+ When running under Java 9 or later, and the
+ <code>urlCacheProtection</code> option of the
+ <code>JreMemoryLeakPreventionListener</code> is enabled, use the API
+ added in Java 9 to only disable the caching for JAR URL connections.
+ (markt)
+ </add>
</changelog>
</subsection>
<subsection name="Coyote">
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org