在Java应用程序运行的过程中可能会因为某些异常的情况导致服务不可用,例如

  1. 内存溢出
  2. 无法提供服务(服务线程死锁、fullGC等)

为了在发生故障后能有更多的信息供分析,所以可以在java的启动参数中添加一些参数来记录相关日志。

1,内存溢出时记录堆栈转储数据

-XX:+HeapDumpOnOutOfMemoryError   #JVM发生OOM时,自动生成DUMP文件
-XX:HeapDumpPath=/crashes/heapdump  #生成DUMP文件的路径或文件名称,例如heapdump.hprof(默认文件名:java_<pid>_<date>_<time>_heapDump.hprof)

-XX:OnOutOfMemoryError=/scripts/restart-myapp.sh #发生内存溢出的时候让JVM调用shell脚本

还有两个不太推荐的参数“-XX:OnOutOfMemoryError”和“-XX:+CrashOnOutOfMemoryError”,两者均表示当发生内存溢出的时候,JVM就会立马退出。 但当配置“-XX:+CrashOnOutOfMemoryError”时JVM会产生文本和二进制格式的崩溃日志,而“-XX:OnOutOfMemoryError”则只退出而不输出日志。

2,记录垃圾收集的信息

-XX:+PrintGCApplicationStoppedTime   #打印GC造成应用暂停的时间

-XX:+PriintHeapAtGC   #每次gc(yonggc,fullgc) 都输出gc前后堆详情

-XX:+PrintGC      #开启GC信息输出(不推荐)
-verbose:gc       #开启GC信息输出(推荐)

-XX:+PrintGCDetatils       #打印GC详细信息(会自动开启GC信息打印)
-XX:+PrintGCTimeStamps     #打印GC收集的时间戳
-XX:+PrintGCDateStamps     #以日期形式输出GC的时间戳

-XX:+UseGCLogFileRotation     #GC日志轮转【其实不是很推荐,因为日志文件会被覆盖】
-XX:NumberOfGCLogFiles=10     #设置最多的gc文件格式
-XX:GCLogFileSize=20M         #设置每个gc文件的最大大小
-Xloggc:/opt/gclog/gc_%t.log     #指定输出gc.log的文件位置

“-XX:+PrintGC”与“-verbose:gc”都是开启打印GC信息的参数,只是“-XX:+PrintGC”不再推荐使用; “-XX:+PrintGCDetatils”会自动开启打印GC信息; “-Xloggc”参数会重写“-verbose:gc”;

常用的配置

java -server -Xms8g -Xmx8g -Xmn256m -Xss256k 
-XX:+PrintHeapAtGC 
-XX:+PrintGCApplicationStoppedTime
-XX:+PrintGCDetails 
-XX:+PrintGCDateStamps 
-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=10
-XX:GCLogFileSize=20M
-Xloggc:/opt/gclog/gc_%t.log
-XX:+HeapDumpOnOutOfMemoryError 

示例:Tomcat的catalina.bat文件

set JAVA_OPTS=-server -Xms1g -Xmx1g -Xmn256m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=../logs/heapdump -XX:+PrintHeapAtGC  -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=20M -Xloggc:../logs/gclog/gc.log

记得在logs目录下创建gclog和heapdump文件夹哦