过多的jstat“类加载器时间”

时间:2014-10-01 23:05:27

标签: java jvm classloader jstat

我们的基于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数据的一系列活动。

我的问题是:

  • 这是否真的表明存在问题?
  • 如果是这样,还有什么可以做的来诊断呢?

非常感谢任何建议。

1 个答案:

答案 0 :(得分:1)

这似乎是一个真正的问题。鉴于类加载时间增加而加载类的数量保持不变,我可能会得出结论,应用程序试图一遍又一遍地加载缺失的类,例如Class.forNameClassLoader.loadClass

如果缺少某个类,JVM将在抛出ClassNotFoundException之前扫描整个类路径。如果类路径包含许多JAR甚至网络URL,则可能需要很长时间。

为了进一步诊断,我建议使用instrument Class.forNameClassLoader.loadClass方法或intercept ClassNotFoundExceptions