java通用调试指导-Java通用故障处理(一)

来源:https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/toc.html

一、通用故障处理
1. java故障处理准备

1.1 使用最新版本的java

1.2 启用JVM故障处理的选项/标识(Options/flags)
   (1)启动core file
           启用core file情况下,如果java崩溃,OS会把core文件保存到磁盘。注:core file可能会占用大量磁盘空间,特别是
          启动core file,请在启动应用程序前,在命令行执行limit c unlimited。

 (2)JVM flags加入-XX:+HeapDumpOnOutOfMemoryError标记。
          加入本标记后,当程序遇到OutOfMemoryError错误时,会将java堆保存到本地磁盘。可使用The jhat Utility工具检查java堆,找到占用空间大、且不再使用但依然alive的对象。
          注:heap dumps也可能占用大量磁盘空间呢。

  (3)运行连续的JFR(The Java Flight Recorder)
          JFR是个商用特性,在开发者桌面、PC上可以免费使用。但是在生产服务器上需要购买Lincese。
          运行连续的JFR后,JFR事件缓存区会循环保存NFR记录。如果应用程序出现问题,就可以从NFR事件缓存区获取、转存最后一个小时的数据。HFR对调试内存泄露、网络错误、高CPU使用率、线程阻塞等问题十分有帮助。

          运行JFR后,JFR本身运行开销十分小。

 (4)JVM命令行加入-verbosegc,通过日志记录java垃圾收集器(Java Garbage Collector)的基本信息,通过这些信息日志,可以发现:
          a.垃圾收集是否长时间运行?
          b.空闲内存是否会随着时间减少?

         此功能,有助于应用程序发生aOutOFMemoryError错误,或应用程序遇到性能瓶颈时诊断问题。因此,此选项默认打开十分有助于故障处理。

         注:使用日志轮换(Use log rotation),这样应用程序重新启动不会删除以前的日志。JDK7开始,可以使用flagsUseGClogFileRotation和NumberOfGCLogFilescan来设置日志轮转。

  (5)打印java版本和JVM flags
         命令行通过java -version打印java版本。
         另一种方式是在JVM参数中添加-XX+PrintCommandLineFlags和-showversion

  (6)设置JMC JMX进行远程监控
         JMX可用来通过Mission Control或VisualVM等工具远程连接到Java应用程序。除非你可以在运行应用程序的同一机器上运行如上工具,否则使用这些工具在以后监视应用程序、发送诊断命令、管理JFR等方面会很有帮助。
         运行JMX没有性能开销。
         JMX详情参考:https://docs.oracle.com/javase/8/docs/technotes/guides/management/agent.html

1.3 收集相关数据
    如果应用程序运行遇到问题,并且希望进一步调试问题,请确保在重新启动系统之前收集任何相关数据,特别是如果重新启动会删除以前的文件。
    需要收集的重要文件如下:
        a.崩溃问题的Core files。
        b.java崩溃打印的hs_err文本文件
        c.日志文件:包含应用程序日志、java日志
        d.启动-XX:+HeapDumpOnOutOfMemoryError标记生成的java堆信息
        e.JFR-如果应用程序遇到问题没有终止,转存连续记录。

     如果应用程序停止响应,收集如下信息:
        f.堆栈信息,在重新启动应用程序前执行jcmd <pid> Thread.print获取堆栈信息。
        g.Dump flight recordings (if enabled).
        h.强制core file。如果应用程序不能正常关闭,则停止应用程序,并在Linux或Solaris系统上使用kill -6 <pid>命令强制core文件。

    如何使java应用程序更易于调试:
        使用java日志框架是一种好方法。如果在特定模块中遇到问题,您应该能够在该模块中启用日志记录。指定不同的日志记录级别也不错,例如info、debug、trace。java.util.logging框架的使用方法请参见Java日志技术。

原文地址:https://www.cnblogs.com/yickel/p/12519643.html