故事:我正在解决我的 Web 应用程序应用程序背景的一些性能问题:这个应用程序是用 Tomcat9 服务器Java
,使用Velocity Template Engine
和前端javaScript
问题:当我让应用程序运行 10-15 分钟时,应用程序变慢了,所以我尝试进行VisualVM
分析,发现了一些痕迹,我想与大家分享。
更新 我调试它更多,并找到冗余调用函数的
主要原因Open
RandomAccessFile
在 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
但我对读取库文件的调用并没有减少。
所以基本问题是当我让我的应用程序运行(意味着在 Tomcat 服务器上运行但不在网络浏览器上使用)10-15 分钟时,应用程序变慢,当我对应用程序进行分析时,我发现了这个
java.util.jar.JarFile.init() 方法耗时 46 秒
我需要什么解决方案: 如果有人遇到这种问题,或者知道我现在可以在哪里进一步调查,那会很好,现在我面临卡住
提前致谢 :)
PS:我删除了一些文件名。因为它们是私有的并且需要保护感谢您不询问这些文件是什么:)