java.util.jar.jarfile.init()方法执行时间太长
故事:我正在解决Web应用程序的一些性能问题 应用背景:该应用程序是用java.util.jar.jarfile.init()方法执行时间太长,java,performance,visualvm,tomcat9,openjdk-11,Java,Performance,Visualvm,Tomcat9,Openjdk 11,故事:我正在解决Web应用程序的一些性能问题 应用背景:该应用程序是用Java编写的,带有Velocity模板引擎,前端javaScript使用Tomcat9服务器 问题:当我让应用程序运行10-15分钟时,应用程序速度会减慢,因此我尝试进行VisualVM评测,并发现了一些痕迹,希望与大家分享 更新 我对它进行了更多的调试,并在RandomAccessFile 这是呼叫stackeTrace 在StandardRoot.java中,我们有一个方法,用于查找资源 private WebRes
Java
编写的,带有Velocity模板引擎
,前端javaScript
使用Tomcat9服务器
问题:当我让应用程序运行10-15分钟时,应用程序速度会减慢,因此我尝试进行VisualVM
评测,并发现了一些痕迹,希望与大家分享
更新我对它进行了更多的调试,并在
RandomAccessFile
这是呼叫stackeTrace
在StandardRoot.java中,我们有一个方法,用于查找资源
private WebResource getResource(String path, boolean validate,
boolean useClassLoaderResources) {
if (validate) {
path = validate(path);
}
if (isCachingAllowed()) {
return cache.getResource(path, useClassLoaderResources);
} else {
return getResourceInternal(path, useClassLoaderResources);
}
}
该函数调用getResourceInternal
,从而加载资源
一次又一次,如果它仍然可用
我也试图找到一些Tomcat配置。我做了一些改变,比如
在context.xml中
<Context>
<Resources cachingAllowed="true" cacheTtl="36000000" cacheMaxSize="51200"/>
.........
..........
</Context>
.........
..........
这有助于我增加缓存对象的时间,如默认情况下cacheTtl为5秒,我将其增加到1小时,并cachingAllowed
true
并且cacheMaxSize
设置为50mb
我能够在StandardRoot.java
中加载和读取这些参数,但我对读取库文件的调用并没有减少
所以基本问题是当我让我的应用程序运行10-15分钟(意味着在Tomcat服务器上运行,但不在web浏览器上使用)时,应用程序会变慢,而当我对应用程序进行评测时,我发现了这一点
java.util.jar.JarFile.init()方法花费了46秒
我需要什么样的解决方案:如果有人面临这种问题,或者知道我现在可以进一步研究的地方,那就好了,现在我面临着困境
提前感谢:)
我删除了一些文件名。因为它们是私人的,需要保护
感谢您没有询问这些文件是什么:)我发现这里至少有两个问题。1) . JarFile构造函数不太可能成为瓶颈,因为它除了调用
super
之外几乎什么都不做。我建议像这样的操作系统级分析器。2) 对每个请求调用EventCartridge.addEventHandler
。您所说的方式肯定有问题,因为它会导致昂贵的类加载。@a在这张票中,我的问题与我的问题相同,请仔细检查loook@apangin,我更新了一些调试跟踪,请看一看,看看你能帮到什么:)这与链接的问题不同,因为这个问题是关于getNextJarEntry
操作的,而不是关于您的构造函数。此外,您还有一个if(isCachingAllowed())
语句,并说getResourceInternal
调用是罪魁祸首,尽管它在else子句中,换句话说,它指示isCachingAllowed()
返回false
,这与您发布的配置相反…