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日志技术。
标签:core,java,应用程序,通用,JVM,JFR,Java,日志 来源: https://www.cnblogs.com/yickel/p/12519643.html