常见的Java故障排除-故障排除准备

Java8官方文档

设置Java来进行故障排除

        1.更新Java版本:第一步,使用最新的Java版本,避免花时间在已经解决的Bug上面。往往,Java最新版本会修复运行时出现的Bug。使用最新版本的Java可以避免遇到那些已经发现的问题。
        2.设置需要调试的Java环境:不管是单机部署还是分布式应用,都要确保你的应用能够方便的更换Java版本和更改Java的命令行选项。

为JVM故障排除启用选项/标志

1. Enable core files
        如果Java崩溃,举个例子由于分段故障,操作系统会将core file( complete dump of the memory)保存到磁盘中。在Linux和 Solaris操作系统上,有时候默认是不会生成core file。为了能够在Linux和Solaris上获得core file,在启动应用之前,先在命令行中运行ulimit -c unlimited命令。
        注意:core files占用很大一部分磁盘空间,尤其是当运行了一个大型的Java堆时。
        考虑当程序崩溃时,你需要做什么来决定是否开启core files。你是否真的需要查看core filecore file对于许多Java用户是无用的。如果你想要使用本地的调试器例如gdb或者使用 Serviceability Agent来探察可能引起程序崩溃的原因,那么确保在程序启动之前开启core file。获取更多Serviceability Agent工具HSDBCLHSDB的详细信息,请阅读 Java Magazine。
        很多时候,程序崩溃是重现不了的;因此在启动程序之前,尽可能的启用core files

2. Add -XX:+HeapDumpOnOutOfMemoryError to the JVM flags
        如果你使用了-XX:+HeapDumpOnOutOfMemoryError参数,那么如果你的应用运行时出现OutOfMemoryError,程序会将Java堆转储文件存放到磁盘中。使用The jhat Utility工具检查Java堆并找出哪些对象占用最多的内存。然后检查这些对象是否是已经不再使用的,但是依然存活了下来。
        和core files一样,堆转储文件也是非常大的,尤其是运行了一个很大的Java堆时。

3. Run a continuous Java flight recording
        这是一项商业功能

4. Add -verbosegc to the JVM command-line
        -verbosegc会记录有关Java垃圾收集器的基本信息。查看该日志会获取以下几点信息:

  • 垃圾收集器是否运行了很大一段时间?
  • 可用内存是否随着时间的推移而减少?
            当应用程序抛出一个OutOFMemoryError或者遇到性能问题,垃圾收集日志对诊断这类问题就会有帮助。因此默认开启-verbosegc开关可以帮助解决问题。
            注意:为了防止应用程序重启后删除以前的日志,请使用日志轮换。在JDK7以后,设置日志轮换可以使用UseGClogFileRotationNumberOfGCLogFiles这两个开关。这些开关的描述可参考Debugging Options for Java HotSpot VM。

5. Print Java version and JVM flags
        在提交Bug给Java或向论坛寻求帮助之前,请先从日志文件中确认基础的信息。例如,将Java的版本和用到的JVM参数打印出来是非常有帮助的。
        如果你的应用程序是通过脚本启动的,简单的办法就是执行java -version命令来打印出Java版本并且在执行脚本之前打印出执行命令。另外一种选择是向JVM添加-XX+PrintCommandLineFlags-showversion参数。

6. Set up JMC JMX for remote monitoring
        JMX可用于使用Mission Control或Visual VM等工具远程连接Java应用程序。启用JMX没有性能开销。
        关于JMX技术查看这篇文章How to monitor JVM using JMX Technology。
        另一种在Java应用程序已经启动后启用JMX的方式是使用ManagementAgent.start诊断命令。运行jcmd help ManagementAgent.start命令可以获取开关列表,这些开关可以和命令一起发送。
        更多关于jcmd的命令可以查看The jcmd Utility。

收集相关数据

        如果你的应用程序遇到问题了并且你想进一步调试问题,那么请确保在重启系统之前你已经收集了任何相关数据,尤其是那些重启会删除原先文件的系统。
        以下是一些从中收集数据的重要文件:

  • Core files for crash issues
  • hs_err printed text file for Java crashes
  • Log files: Java and application logs.
  • Java heap dumps for -XX:+HeapDumpOnOutOfMemoryError.
  • Java flight recordings (if enabled) - If the problem didn't terminate the application, dump the continuous recordings.
            如果应用程序已经停止响应,那么收集以下文件信息:
  • Stack traces: Take several stack traces using jcmd Thread.print before restarting the system
  • Dump flight recordings (if enabled).
  • Force a core file: If the application can't be closed properly, then stop the application and force a core file using kill -6 on Linux or Solaris systems

你可能感兴趣的:(常见的Java故障排除-故障排除准备)