Java应用排查工具

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

在排查大型应用问题时,考虑以下方案。

设置JVM选项以便收集相关数据,在问题发生前,考虑收集以下数据。

启用核心文件

如果应用崩溃,操作系统会将核心文件保存到磁盘上。

在linux和solaris上,默认禁用核心文件。

启用核心文件,通常在应用启动前,命令如下:

ulimit -c unlimited

注:系统限制具体参考ulimit。较大java堆开启核心文件会占用大量磁盘空间。

-XX:+HeapDumpOnOutOfMemoryError

-XX:+HeapDumpOnOutOfMemoryError

若遇到OutOfMemoryError,该选项将java堆转储到磁盘。

使用jhat工具检查java堆找出占用内存最多的对象,检查不再使用依然存活的对象。若需了解更多参考JDK应用调试工具

大型java堆转存储的过程可能要很长时间,谨慎使用jmap工具转存储。

飞行记录

Java Flight Recorder(JFR)是一款商业工具。

开发人员可在台式机/笔记本电脑上免费它。可在测试、开发和生产环境中执行监测评估。

在生产服务器上启用JFR,需商业许可证。

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

使用飞行记录开销非常低。

-verbosegc

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

此日志能帮助找到如下问题答案:

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

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

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

打印JVM参数

提交java错误或从论坛寻求帮助时,带着基本日志信息,如:打印Java版本和JVM参数。

若应用使用脚本启动,执行前运行java -version,添加-XX+PrintCommandLineFlags和-showversion参数。

设置远程监视

JMX可用于Mission Control、Visual VM等工具,对Java应用执行远程连接,正确设置它们能帮助监视应用,发送诊断命令、管理飞行记录。

启用JMX没有性能开销。

如需对JVM进行调优,可从JVM性能优化一文提到的几个方面入手。

更多参阅JMX监视JVM