我们的基于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,769s(~4h56m!)进行课堂加载,每秒约0.5-0.6秒!我们一直在跟踪性能问题,这是我们最好的罪魁祸首。可以肯定的是,我们检查了其他Java服务:jstat在Time
列中显示了非常低的值(几秒钟,即使在运行了几个小时之后)
我们的代码不会进行常数类加载,但我们无法排除行为不当的第三方库。我们启用-verbose:gc
希望诊断问题。但是,一旦我们的服务器加载了所有类(大约一分钟左右的繁忙流量),详细的类日志就会变得安静 - 我们期待看到jstat数据的一系列活动。
我的问题是:
非常感谢任何建议。
答案 0 :(得分:1)
这似乎是一个真正的问题。鉴于类加载时间增加而加载类的数量保持不变,我可能会得出结论,应用程序试图一遍又一遍地加载缺失的类,例如Class.forName
或ClassLoader.loadClass
。
如果缺少某个类,JVM将在抛出ClassNotFoundException
之前扫描整个类路径。如果类路径包含许多JAR甚至网络URL,则可能需要很长时间。
为了进一步诊断,我建议使用instrument Class.forName
和ClassLoader.loadClass
方法或intercept ClassNotFoundExceptions
。