Hello i have already encounter this kind of problem, we solved it by using a decorator to cache asset access with something like, it was for Tapestry 5.0.18 :
public class AssetSourceCacheDecorator implements AssetSource { private final Map<MultiKey, *Asset*> cache = CollectionFactory.newConcurrentMap(); private final AssetSource delegate; public AssetSourceCacheDecorator(AssetSource delegate) { this.delegate = delegate; } public *Asset* getAsset(Resource baseResource, String path, Locale locale) { MultiKey key = new MultiKey(path, locale); if (cache.get(key) == null) { * Asset* *asset* = delegate.getAsset(baseResource, path, locale); cache.put(key, *asset*); return *asset*; } return cache.get(key); } public *Asset* getClasspathAsset(String path) { return this.getClasspathAsset(path, null); } public *Asset* getClasspathAsset(String path, Locale locale) { return this.getAsset(null, path, locale); } } Regards, Christophe. 2009/10/29 Christiansen Merel <c.me...@otakeh.com> > Hello out there, > > We're running a quite busy website with tapestry 5.0.18 and we're > hitting a performance problem with the ClasspathResource class. > > We're using classpath asset and none of them is localised. For each > hit on a page using a classpath asset, we end having 2 missed queries > on the ClassLoader for potential localized version of the asset. It > does not really slow down the application throughput but we end with > an __huge__ CPU consumption. > > The javacore stack shows numerous threads scanning jar files: > > 3XMTHREADINFO "[ACTIVE] ExecuteThread: '2' for queue: > 'weblogic.kernel.Default (self-tuning)'" (TID:0x3700E400, > sys_thread_t:0x3393D030, state:B, native ID:0x009AB0B3) prio=5 > 4XESTACKTRACE at > java/util/zip/ZipFile.getEntry(ZipFile.java:287(Compiled Code)) > 4XESTACKTRACE at > java/util/jar/JarFile.getEntry(JarFile.java:283(Compiled Code)) > 4XESTACKTRACE at > java/util/jar/JarFile.getJarEntry(JarFile.java:266(Compiled Code)) > 4XESTACKTRACE at > sun/misc/URLClassPath$JarLoader.getResource(URLClassPath.java:949(Compiled > Code)) > 4XESTACKTRACE at > sun/misc/URLClassPath$JarLoader.findResource(URLClassPath.java:938(Compiled > Code)) > 4XESTACKTRACE at > sun/misc/URLClassPath.findResource(URLClassPath.java:299(Compiled > Code)) > 4XESTACKTRACE at > java/net/URLClassLoader$3.run(URLClassLoader.java:784(Compiled Code)) > 4XESTACKTRACE at > java/security/AccessController.doPrivileged(AccessController.java:219) > 4XESTACKTRACE at > java/net/URLClassLoader.findResource(URLClassLoader.java:781(Compiled > Code)) > 4XESTACKTRACE at > java/lang/ClassLoader.getResource(ClassLoader.java:420(Compiled Code)) > 4XESTACKTRACE at > java/lang/ClassLoader.getResource(ClassLoader.java:415(Compiled Code)) > 4XESTACKTRACE at > java/lang/ClassLoader.getResource(ClassLoader.java:415(Compiled Code)) > 4XESTACKTRACE at > > weblogic/utils/classloaders/GenericClassLoader.getResourceInternal(GenericClassLoader.java:170(Compiled > Code)) > 4XESTACKTRACE at > > weblogic/utils/classloaders/GenericClassLoader.getResource(GenericClassLoader.java:187(Compiled > Code)) > 4XESTACKTRACE at > > weblogic/utils/classloaders/FilteringClassLoader.getResourceInternal(FilteringClassLoader.java:89(Compiled > Code)) > 4XESTACKTRACE at > > weblogic/utils/classloaders/GenericClassLoader.getResourceInternal(GenericClassLoader.java:155(Compiled > Code)) > 4XESTACKTRACE at > > weblogic/utils/classloaders/GenericClassLoader.getResource(GenericClassLoader.java:187(Compiled > Code)) > 4XESTACKTRACE at > java/lang/ClassLoader.getResource(ClassLoader.java:415(Compiled Code)) > 4XESTACKTRACE at > > weblogic/utils/classloaders/GenericClassLoader.getResource(GenericClassLoader.java:190(Compiled > Code)) > 4XESTACKTRACE at > > weblogic/utils/classloaders/ChangeAwareClassLoader.getResource(ChangeAwareClassLoader.java:118(Compiled > Code)) > 4XESTACKTRACE at > > org/apache/tapestry5/ioc/internal/util/ClasspathResource.toURL(ClasspathResource.java:59(Compiled > Code)) > 4XESTACKTRACE at > > org/apache/tapestry5/ioc/internal/util/AbstractResource.exists(AbstractResource.java:137(Compiled > Code)) > 4XESTACKTRACE at > > org/apache/tapestry5/ioc/internal/util/AbstractResource.forLocale(AbstractResource.java:100(Compiled > Code)) > 4XESTACKTRACE at > > org/apache/tapestry5/internal/services/AssetSourceImpl.findRelativeAsset(AssetSourceImpl.java:99(Compiled > Code)) > 4XESTACKTRACE at > > org/apache/tapestry5/internal/services/AssetSourceImpl.getAsset(AssetSourceImpl.java:93(Compiled > Code)) > 4XESTACKTRACE at > $AssetSource_124955c0e4c.getAsset($AssetSource_124955c0e4c.java(Compiled > Code)) > 4XESTACKTRACE at > > org/apache/tapestry5/internal/transform/AbstractIncludeAssetWorker$1.perform(AbstractIncludeAssetWorker.java:79(Compiled > Code)) > 4XESTACKTRACE at > > fr/poleemploi/d2i/tapestry/navigation/unifiee/components/Bandeau.setupRender(Bandeau.java(Compiled > Code)) > > The stack comes from weblogic/aix run but the problem is the same on > other platforms as well. > > Does anyone has ever experienced such problems ? > > The performance penalty seems to be located in the > AbstractResource.forLocale() method, especially the potential.exists() > call. This part of code haven't evolved with the 5.1.x version. > > Does anybody have any idea on how to get around this problem ? > > Thanks in advance > > -- > ChristianZen > > --------------------------------------------------------------------- > To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org > For additional commands, e-mail: users-h...@tapestry.apache.org > >