java - WebappClassLoader tager intermitterende 12 sekunder at indlæse den lokale JAR-fil

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har et produktionsspørgsmål, som jeg ikke kan replikere i udviklings- eller testmiljøer. Da det er i produktion, kan jeg ikke stoppe/starte Tomcat uden en masse tape.


Jeg observerer forsinkelser på ca. 12 sekunder (give eller tage 500ms) i tråde af udførelse, der bruger AudioSystem-klassen. Forsinkelserne opstår intermitterende og aldrig inden for få minutter fra hinanden. Andre tråde fortsætter samtidigt uden problemer. Forsinkelserne synes at blive mindre hyppige med højere belastning.


Jeg var i stand til at samle stakspor, mens forsinkelsen sker ved at bruge fanen JConsole-tråde. f.eks.


Name: http-8081-Processor27
State: RUNNABLE
Total blocked: 134,991  Total waited: 23,132

Stack trace: 
java.util.zip.ZipFile.open(Native Method)
java.util.zip.ZipFile.<init>(Unknown Source)
java.util.jar.JarFile.<init>(Unknown Source)
java.util.jar.JarFile.<init>(Unknown Source)
org.apache.catalina.loader.WebappClassLoader.openJARs(WebappClassLoader.java:1789)
org.apache.catalina.loader.WebappClassLoader.findResources(WebappClassLoader.java:1019)
java.lang.ClassLoader.getResources(Unknown Source)
sun.misc.Service$LazyIterator.hasNext(Unknown Source)
com.sun.media.sound.JSSecurityManager$7.run(Unknown Source)
java.security.AccessController.doPrivileged(Native Method)
com.sun.media.sound.JSSecurityManager.getProviders(Unknown Source)
com.sun.media.sound.JDK13Services.getProviders(Unknown Source)
javax.sound.sampled.AudioSystem.getProviders(Unknown Source)
javax.sound.sampled.AudioSystem.getAudioFileReaders(Unknown Source)
javax.sound.sampled.AudioSystem.getAudioInputStream(Unknown Source)


Det ser ud som om indlæsningen af ​​JAR-filer af WebappClassLoader er impliceret. Jeg tweaked denne klasselæsser i udviklingsmiljøet for at logge ud de JARs, som den indlæser. Der er 55 JAR'er indlæst, alt fra en lokal disk, f.eks .:


Fri Mar 02 17:02:04 EST 2012    About to open: E:mycompanyAppsApacheTomcat 5.5webappsapplicationWEB-INFliblog4j-1.2.15.jar


Serveren har en fejlkonfigureret proxyserver. Dette kan pålideligt producere 12 sekunders forsinkelser ved hentning af websider. DEV- og TEST-miljøer er imidlertid også fejlkonfigureret, men viser endnu ikke forsinkelserne. Ville det få Java til at vise forsinkelser, når du åbner lokale JAR-filer?


Tomcat er blevet tildelt 1500MB maksimal hukommelse. GC er ConcurrentMarkSweep og bruger aldrig mere end 800 MB.


Serveren er bygget med Windows 2003, Tomcat 5.5.23, Java 1.5.0-v14. Eventuelle spor om hvad der sker vil blive meget værdsat.

Bedste reference


Det lyder som om klasselasteren forsøger at tale med internettet via din proxy. Jeg kontrollerer den måde, du har konfigureret klasselæseren. I betragtning af at klasseladeren først og fremmest vil delegere sin moderklasseladerkæde først, så skal du også tjekke dem.


Det kan hjælpe dig med at spore problemet, hvis du midlertidigt fortalte Java at bruge en intern proxy, så du kunne se, hvad klasselæseren forsøger at hente fra internettet.