Hi,

After moving one of our web applications from Tomcat 7 to Tomcat 8 (latest 
8.0.17) the time for deploying and initializing the webapp increased by a 
factor of 30 (6s vs. 180s). Analyzing the problem we found out that it had to 
do with a signed jar in the WEB-INF/lib of the webapp. It is a 8mb self-signed 
jar of the jython-library from which some classes are used in the initializing 
process of our webapp. When using a non-signed version of the jar the time for 
deploying and initializing is the same in Tomcat 8 as in Tomcat 7. Has anyone 
experienced similar problems with signed jars in Tomcat 8?

Profiling and debugging the webapp it turned out that loading a class (and its 
depending classes) from the signed jar took extremely long with Tomcat 8 in 
comparison to Tomcat 7. Indeed classloading from the signed jar seems to be 
responsible for most of the additional time for initializing the webapp in 
Tomcat 8. Because the performance problems do not occur with a non-signed 
version of the jar this additional time is probably spent in verifying the 
signatures of the jar. Because there seems to be no way to disable the 
verification of jars in general in Tomcat I took a look at the sources of the 
new WebappClassLoader of Tomcat 8.

The following is just a hypothesis of a "Tomcat source newbie": Could it be 
that (at least some parts of) the verification process for the whole signed jar 
is done again and again each time a class from a signed jar is loaded? Looking 
at org.apache.catalina.webresources.JarResource:47  
(http://svn.apache.org/repos/asf/tomcat/tc8.0.x/trunk/java/org/apache/catalina/webresources/JarResource.java)
 a new instance of java.util.jar.JarFile is created each time a single 
class-file is read from the jar. Thus the following call of 
jarFile.getInputStream(jarEntry) in JarResource:50 causes a call of 
JarFile.initializeVerifier() (cf. JarFile:442ff in 
http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8-b132/java/util/jar/JarFile.java).
 JarFile.initializeVerifier() seems to do some precalculations (hashing?) for 
all files listed in the manifest of the signed jar (cf. JarFile:365ff). Thus 
each time a single class is loaded from a signed jar precalculations for all 
class files in the signed jar seem to be done. Could this be the reason for our 
performance problems (especially in connection with a 8mb signed jar ;-))?

Best regards
Ole

+++ ?ber 5.000 Ausgaben t?glich +++
Mehr als 100 Medienh?user weltweit produzieren t?glich Zeitungen
und digitale Angebote mit ppi Media L?sungen

+++ Over 5,000 editions daily +++
More than 100 media companies worldwide produce newspapers
and digital products with ppi Media's solutions.

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org

Reply via email to