JDK工具排查Java应用程序问题

利用JDK自带工具排查问题,最好使用最新版本,以避免把时间浪费在已修复的Java问题上。

通常,Java运行时错误引发的问题,在最新版本都会得到修复,使用最新的Java版本的JDK,可以避免一些已知和常见的问题。在对大型Java应用程序进行问题排查时,可以考虑以下方案。

设置JVM选项/标志位,以便收集相关数据以进行故障排除。收集的数据取决于系统,以及遇到问题时需要使用的数据,在遇到问题之前,可以考虑收集以下数据。

启用核心文件(Enable core files)

如果Java崩溃,如:遇到“段错误”(segmentation fault),操作系统会将核心文件保存到磁盘(完全转储内存)上。

在Linux和Solaris上,默认情况下,通常会禁用核心文件。要在Linux/Solaris上启用核心文件,通常在启动应用程序之前,在命令行运行命令ulimit -c unlimited(某些系统可能有不同的方法来处理这些限制),具体可以参考ulimit用法及配置示例

注:尤其运行时占用较大Java堆时,该核心文件会占用大量的磁盘空间。

是否启用核心文件,要考虑在系统崩溃时需要执行的操作,如果,希望在本机中调试崩溃,确保在应用程序启动之前启用核心文件。

启用-XX:+HeapDumpOnOutOfMemoryError选项

-XX:+HeapDumpOnOutOfMemoryError

如果应用程序遇到OutOfMemoryError,该标识位将Java堆转储保存到磁盘。使用jhat工具检查Java堆,并找出占用空间最多的对象,然后,检查不再使用,但依然存活的对象。如果,需要使用更多的jdk调试工具,可以参考JDK自带的Java程序调试工具

与核心文件一样,堆转存储可能非常大,尤其是在使用大型Java堆运行时,这个存储的过程可能需要很长时间,所以谨慎使用jmap工具转存储,尤其是在应用程序还能对用户的操作作出响应的情况下。

运行连续的Java飞行记录(Run a continuous Java flight recording)

Java Flight Recorder(JFR)是一项商业功能。可以在开发人员台式机/笔记本电脑上免费使用它,并可以在测试、开发和生产环境中进行监测评估。但要在生产服务器上启用JFR,需要商业许可证。

连续飞行记录是基于JFR事件的循环缓存数据,如果应用程序遇到问题,可以查看最近一小时运行的转储数据,JFR事件对于调试内存泄漏、网络错误、CPU高占用率,线程阻塞等各种问题非常有用。

使用连续飞行记录运行的开销非常低,有关生成连续Java Flight Recording的更多详细信息,请参阅如何生成Flight Recording。

将-verbosegc应用到JVM中(Add -verbosegc to the JVM command-line)

-verbosegc记录有关Java Garbage Collector的基本信息。

此日志能够帮助找到以下问题的答案:

垃圾收集运行了很长时间吗?随着时间的推移,空闲内存会减少吗?

垃圾收集器日志,有助于在应用程序抛出OutOFMemoryError,或应用程序遇到性能问题时进行诊断问题,通常情况下打开-verbosegc标识位有助于解决问题。

注意:使用日志轮换,以便应用程序重新启动时,不会删除以前的日志。JDK7 UseGClogFileRotation和NumberOfGCLogFiles 标识位可用于设置日志旋转。有关这些标志的说明,请参阅Java HotSpot VM的调试选项

打印Java版本和JVM标志(Print Java version and JVM flags)

在提交Java错误或从论坛寻求帮助之前,使用日志文件中的基本信息,如:打印出Java版本和使用的JVM标志会很有帮助。

如果应用程序使用脚本启动,只需在执行之前运行java -version就可打印出Java版本,而另一种方法就是添加-XX+PrintCommandLineFlags和-showversionJVM参数。

设置JMC JMX以进行远程监视(Set up JMC JMX for remote monitoring)

JMX可使用Mission Control或Visual VM等工具,对Java应用程序进行远程连接,正确设置它可以帮助监视应用程序,发送诊断命令、管理飞行记录等。启用JMX没有性能开销。如果需要对JVM进行调优,可以从JVM性能优化(调优)一文所提到的几个方面入手。

更多详情参阅如何使用JMX技术监视JVM的说明