我们基于Java的服务器应用程序报告了异常高级别的加载时间:
# jstat -class 10625 1000
Loaded Bytes Unloaded Bytes Time
4781 9165.6 114 185.2 17769.35
4781 9165.6 114 185.2 17769.85
4781 9165.6 114 185.2 17770.36
4781 9165.6 114 185.2 17771.11
4781 9165.6 114 185.2 17771.73这是在一个已经运行了8小时的服务器上。jstat报告说它已经花费了17,769 s (~4h56m!)做类加载,大约0.5秒-0.6秒每秒钟!我们一直在追踪一个性能问题,这是我们最好的罪犯候选人。为了确保,我们检查了我们的其他Java服务: jstat在Time列中显示了一个非常低的值(即使在运行了几个小时之后,也只有几秒钟)。
我们的代码不执行常量的类加载,但我们不能排除一个行为错误的第三方库。我们启用了-verbose:gc,希望能够诊断出问题。但是,一旦我们的服务器加载了它的所有类(在流量大的一分钟内),冗长的类日志就安静下来了--我们半以为会看到一系列的活动--考虑到jstat数据。
我的问题是:
会很感激你的建议。
发布于 2014-10-02 13:25:13
这似乎是个真正的问题。如果类加载时间增加,而加载类的数量保持不变,我可能会得出结论,应用程序试图一次又一次地加载缺少的类,例如通过Class.forName或ClassLoader.loadClass。
如果缺少一个类,JVM将在抛出ClassNotFoundException之前对整个类路径进行扫描。如果一个类路径包含许多JAR甚至网络URL,这可能需要很长时间。
为了进一步诊断这一点,我建议instrument、Class.forName和ClassLoader.loadClass方法或intercept ClassNotFoundExceptions。
https://stackoverflow.com/questions/26152084
复制相似问题