在Java应用程序运行的过程中可能会因为某些异常的情况导致服务不可用,例如
- 内存溢出
- 无法提供服务(服务线程死锁、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文件夹哦