设置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 file
?core file
对于许多Java用户是无用的。如果你想要使用本地的调试器例如gdb
或者使用 Serviceability Agent来探察可能引起程序崩溃的原因,那么确保在程序启动之前开启core file
。获取更多Serviceability Agent工具HSDB
和CLHSDB
的详细信息,请阅读 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
以后,设置日志轮换可以使用UseGClogFileRotation
和NumberOfGCLogFiles
这两个开关。这些开关的描述可参考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 <pid> 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 <pid> 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 <pid>
on Linux or Solaris systems
网友评论