实验出问题了
在服务器上执行nohup java -jar server-v1.0.jar -d /data/wave/wzm/out3/2018-03/ -s 172.18.20.215 -t wave201803 > nohup5.out 2>&1 &
之后的nohup.out文件,如下1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22nohup: ignoring input
ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
完成 resource 初始化!
22:14:44.694 [nioEventLoopGroup-2-1] ERROR com.globigdata.server.LineParseHandler - java.io.IOException: Invalid argument
5, tid=0x00007f799d0fb700
#
# JRE version: Java(TM) SE Runtime Environment (8.0_171-b11) (build 1.8.0_171-b11)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.171-b11 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# J 1748 C2 sun.nio.ch.IOUtil.write(Ljava/io/FileDescriptor;[Ljava/nio/ByteBuffer;IILsun/nio/ch/NativeDispatcher;)J (509 bytes) @ 0x00007f79a5
2ee461 [0x00007f79a52edce0+0x781]#
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# An error report file with more information is saved as:
# /data/hs_err_pid18285.log
#
# If you would like to submit a bug report, please visit:
# http://bugreport.java.com/bugreport/crash.jsp
#
什么时候会产生该文件?
当JVM发生致命错误导致崩溃时,会生成一个hs_err_pid_xxx.log这样的文件,该文件包含了导致 JVM crash 的重要信息,我们可以通过分析该文件定位到导致 JVM Crash 的原因,从而修复保证系统稳定。
he_err_pid.log包含的内容
日志头文件
1 | # |
这段内容主要简述了导致 JVM Crash 的原因。常见的原因有 JVM 自身的 bug,应用程序错误,JVM 参数,服务器资源不足,JNI 调用错误等。当然还有一些版本和配置信息,1
SIGSEGV (0xb) at pc=0x00007f79a52ee461, pid=18285, tid=0x00007f799d0fb700
非预期的错误被 JRE 检测到了,其中
- SIGSEGV :信号量
- 0xb :信号码
- pc=0x00007f79a52ee461 :程序计数器的值
- pid=18285 :进程号
- tid=0x00007f799d0fb700:线程号
SIGSEGV(0xb) 表示 JVM Crash 时正在执行 JNI 代码,常见的描述还有EXCEPTION_ACCESS_VIOLATION,该描述表示 JVM Crash 时正在执行 JVM 自身的代码,这往往是因为 JVM 的 Bug 导致的 Crash;另一种常见的描述是EXCEPTION_STACK_OVERFLOW,该描述表示这是个栈溢出导致的错误,这往往是应用程序中存在深层递归导致的。1
2
3# Problematic frame:
# J 1748 C2 sun.nio.ch.IOUtil.write(Ljava/io/FileDescriptor;[Ljava/nio/ByteBuffer;IILsun/nio/ch/NativeDispatcher;)J (509 bytes) @ 0x00007f79a5
2ee461 [0x00007f79a52edce0+0x781]#
这个信息比较重要,问题帧信息:
C : 表示帧类型为本地帧
j :解释的Java帧
V : 虚拟机帧
v :虚拟机生成的存根栈帧
J :其他帧类型,包括编译后的Java帧
导致 crash 的线程信息
1 | --------------- T H R E A D --------------- |
这部分内容包含触发 JVM 致命错误的线程详细信息和线程栈1
2Current thread (0x00007f79b462c000): JavaThread "nioEventLoopGroup-2-1" [_thread_in_Java, id=18354, stack(0x00007f799cffb000,0x00007f799d0fc0
00)]
- 0x00007f79b462c000:出错的线程指针
JavaThread:线程类型,可能的类型包括
JavaThread:Java线程
VMThread : JVM 的内部线程
CompilerThread:用来调用JITing,实时编译装卸class 。 通常,jvm会启动多个线程来处理这部分工作,线程名称后面的数字也会累加,例如:CompilerThread1
GCTaskThread:执行gc的线程
WatcherThread:JVM 周期性任务调度的线程,是一个单例对象
ConcurrentMarkSweepThread:jvm在进行CMS GC的时候,会创建一个该线程去进行GC,该线程被创建的同时会创建一个SurrogateLockerThread(简称SLT)线程并且启动它,SLT启动之后,处于等待阶段。CMST开始GC时,会发一个消息给SLT让它去获取Java层Reference对象的全局锁:LocknioEventLoopGroup-2-1:线程名称
- _thread_in_native:当前线程状态。该描述还包含有:
_thread_in_native:线程当前状态,状态枚举包括:
_thread_uninitialized:线程还没有创建,它只在内存原因崩溃的时候才出现
_thread_new:线程已经被创建,但是还没有启动
_thread_in_native:线程正在执行本地代码,一般这种情况很可能是本地代码有问题
_thread_in_vm:线程正在执行虚拟机代码
_thread_in_Java:线程正在执行解释或者编译后的Java代码
_thread_blocked:线程处于阻塞状态
…_trans:以_trans结尾,线程正处于要切换到其它状态的中间状态
- id=18354:线程ID
- stack(0x00007f799cffb000,0x00007f799d0fc000):栈区间
所有线程信息
1 | Java Threads: ( => current thread ) |
_thread_blocked表示阻塞
安全点和锁信息
1 | VM state:not at safepoint (normal execution) |
虚拟机状态。not at safepoint 表示正常运行。其余状态:
at safepoint:所有线程都因为虚拟机等待状态而阻塞,等待一个虚拟机操作完成;
synchronizing:一个特殊的虚拟机操作,要求虚拟机内的其它线程保持等待状态。1
VM Mutex/Monitor currently owned by a thread: None
虚拟机的 Mutex 和 Monitor目前没有被线程持有。Mutex 是虚拟机内部的锁,而 Monitor 则关联到了 Java 对象。
堆信息
1 | Heap: |
新生代、老年代、元空间一目了然。
Card table表示一种卡表,是 jvm 维护的一种数据结构,用于记录更改对象时的引用,以便 gc 时遍历更少的 table 和 root。
本地代码缓存
1 | CodeCache: size=245760Kb used=5251Kb max_used=5700Kb free=240509Kb |
一块用于编译和保存本地代码的内存。
编译事件
1 | Compilation events (10 events): |
记录10次编译事件。这里的信息也印证了上面的结论。
gc 相关记录
1 | GC Heap History (10 events): |
jvm 内存映射
1 | Dynamic libraries: |
这些信息是虚拟机崩溃时的虚拟内存列表区域。它可以告诉你崩溃原因时哪些类库正在被使用,位置在哪里,还有堆栈和守护页信息。
- 00400000-00401000:内存区域
- r-xp:权限,r/w/x/p/s分别表示读/写/执行/私有/共享
- 00000000:文件内的偏移量
jvm 启动参数
1 | VM Arguments: |
jvm 虚拟机参数和环境变量
服务器信息
1 | --------------- S Y S T E M --------------- |