Java应用问题排查工具

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

通常,Java运行时错误引发的问题,在最新版本都会得到修复,使用最新版JDK,可避免一些已知和常见的问题。在排查大型Java应用问题时,可考虑以下方案。设置JVM选项,以便收集相关数据排除故障。收集的数据取决于系统,查找问题所需用到的数据。在问题发生前,考虑收集以下数据。

启用核心文件

如果Java崩溃,操作系统会将核心文件保存到磁盘上。在Linux和Solaris上,默认禁用核心文件。在Linux/Solaris上启用核心文件,通常在应用启动前,运行命令如下:

ulimit -c unlimited

是否启用核心文件,要考虑在系统崩溃时需要执行的操作。

注:某些系统可能有不同方法处理这些限制,具体可以参考ulimit用法及配置示例。尤其运行时占用较大Java堆时,该核心文件会占用大量的磁盘空间。

启用-XX:+HeapDumpOnOutOfMemoryError选项

-XX:+HeapDumpOnOutOfMemoryError

如果遇到OutOfMemoryError,该选项将Java堆转储到磁盘。使用jhat工具检查Java堆,并找出占用内存最多的对象,然后,检查不再使用依然存活的对象。如果,需要使用更多的jdk调试工具,参考JDK自带的Java程序调试工具

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

飞行记录

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

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

将-verbosegc应用到JVM中

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

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

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

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

注意:使用日志轮换,以便应用程序重新启动时,不会删除以前的日志。JDK7 UseGClogFileRotation和NumberOfGCLogFiles选项用于设置日志轮换。详情参阅Java HotSpot VM的调试选项

打印Java版本和JVM参数

提交Java错误或从论坛寻求帮助前,使用日志文件中的基本信息,如:打印出Java版本和使用的JVM参数会很有帮助。如果应用使用脚本启动,只需在执行前运行java -version就可打印出Java版本,另一种方法是添加-XX+PrintCommandLineFlags和-showversionJVM参数。

设置JMC JMX远程监视

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

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