先看下java的内存模型
监控jvm工具:visualVM 摘录一下内容:
由c++开发的jvm,它巧妙地设计了java的设计理念——即万物皆对象。并设计了这些对象应该如何存储,如何调用,并通过不断迭代设计让对象的存储和回收,执行更加合理,下图是jvm的发展历程。
也许开发者未必精通jvm,但对jvm的深入了解可以对开发,排错,调优有非常大的帮助。这里给出最基本的 jvm 入门知识,也是你监控 jvm并期待通过分析jvm来排错调优所必要的基础知识:
- 堆(Heap):
堆是用于存储对象实例的内存区域。在堆中分配的对象包括通过 new 关键字创建的对象以及数组。
所有线程共享堆,但每个对象都有一个标识它的引用。 - 栈(Stack):
栈用于存储方法的局部变量、操作数栈、方法返回地址等。每个线程都有自己的栈。
每个方法在执行时都会创建一个栈帧,栈帧包含了该方法的局部变量表、操作数栈、动态链接、方法返回地址等信息。 - 程序计数器(Program Counter):
程序计数器是每个线程私有的,用于存储当前线程执行的字节码指令的地址或索引。
在多线程环境下,程序计数器用于记录每个线程执行的位置,确保线程切换后能够恢复到正确的执行位置。 - 本地方法栈(Native Method Stack):
本地方法栈类似于栈,但用于执行本地方法(非 Java 语言编写的方法)。
本地方法栈的实现和栈类似,但用于执行本地代码。 - 元空间(Metaspace):
元空间是 JDK 8+ 版本中引入的(替代原来的方法区),使用本机内存存储类的元信息,包括类的结构信息、静态变量
、方法信息等。
查看hive日志
日志:hive-server2.out
,注意不是:hiveserver2.log
2024-09-10 20:21:35,765 HiveServer2-Background-Pool: Thread-13637 ERROR Unable to create Appender of type HushableMutableRandomAccess
java.lang.OutOfMemoryError: Java heap space
Dumping heap to /var/de_log/hive/java_pid36821.hprof ...
Heap dump file created [18346979563 bytes in 27.401 secs]
Terminating due to java.lang.OutOfMemoryError: Java heap space
可以看到发生了OOM的问题OutOfMemoryError,堆heap内存溢出了。
获取hive内存溢出时候的内存快照hprof
hiveserver2日志文件夹内执行:grep OutOfMemory ./hiveserver2-gc.log*
得到如下内容:
./hiveserver2-gc.log.0:CommandLine flags: -XX:+ExitOnOutOfMemoryError -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/xxx/hive/
参数具体意义参考:-XX:+HeapDumpOnOutOfMemoryError
根据/xxx/hive/
和发生hiveserver2 terminate的时间,找到jvm导出的hprof文件,hprof文件大约有17GB。此文件就是发生OutOfMemoryError时刻的内存快照,很大也压缩不了。
ls -lh
-rw------- 1 hive hadoop 17G Sep 9 23:06 java_pid24619.hprof
使用工具分析hprof文件
工具一VisualVM:
此工具是jdk自带的,一般在JAVA_HOME/bin/jvisualvm.exe在win下直接运行就可以了。
载入hprof
文件在就会