2

故事:我正在解决我的 Web 应用程序应用程序背景的一些性能问题:这个应用程序是用 Tomcat9 服务器Java,使用Velocity Template Engine和前端javaScript

问题:当我让应用程序运行 10-15 分钟时,应用程序变慢了,所以我尝试进行VisualVM分析,发现了一些痕迹,我想与大家分享。

在此处输入图像描述 更新 我调试它更多,并找到冗余调用函数的
主要原因OpenRandomAccessFile

这是调用 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但我对读取库文件的调用并没有减少。

所以基本问题是当我让我的应用程序运行(意味着在 Tomcat 服务器上运行但不在网络浏览器上使用)10-15 分钟时,应用程序变慢,当我对应用程序进行分析时,我发现了这个

java.util.jar.JarFile.init() 方法耗时 46 秒

我需要什么解决方案: 如果有人遇到这种问题,或者知道我现在可以在哪里进一步调查,那会很好,现在我面临卡住

提前致谢 :)

PS:我删除了一些文件名。因为它们是私有的并且需要保护感谢您不询问这些文件是什么:)

4

0 回答 0