一、前言
我司大数据平台采用yarn client模式将spark任务提交到yarn上执行,并且平台的所有离线任务都共用一个driver/client进程。在最近的一个数据湖项目中,业务流程多达上百个,内存使用越来越多(现场配置了JVM max heap 60G),在持续运行4~5天后,便会出现心跳超时问题,最终导致Kill离线yarn application。
笔者以往打开、分析Dump文件,主要采用下面两种方法:
1、独立运行的memory analyzer去加载dump文件。
2、在linux 上使用memory analyzer,用ParseHeapDump.sh脚本直接分析dump文件,然后再去查看网页版分析结果即可。
面对40G的大dump文件,我司的办公PC机物理内存仅有8G,用Memory Analyzer加载该Dump时,必会出现OOM异常。(方法一被摒弃)
第二种方式得到的是网页分析结果,运维同事觉得信息不够丰富,比如说看不到实例的调用堆栈信息,因此方法二也被摒弃。
最终在参考链接1的启发下,找到了可行的方法——Linux上启动visualvm进程,利用xmanager、xshell软件,将visualvm 界面在window系统上展示,最后在window界面查看visualvm分析结果。(此处利用的是Linux服务器的内存,我司服务器内存通常都有250GB)。
二、具体使用步骤
2.1 安装xmanager和xshell
在笔者实践过程中,曾经参考csdn的一篇博客,利用xming+xshell/putty软件来让visualvm分析界面在Window界面展示,但后面发现不需要这么麻烦,在我的PC机器上,利用xshell 5、xmanager 4也可以达到同样的效果。
在windows机器上安装xshell、xmanager的过程便不再阐述。下面是我使用的xshell、xmanager版本(提供的是最新版本的,亲测可用),百度网盘链接:
链接:https://pan.baidu.com/s/1qKwGAUSjDAFBMWHB0FxM3A 提取码:bzj0
注:
- 在官网下载,需要填写个人信息,且xmanager 3版本安装后,并不能将visualvm在window界面展示。
2.2 下载、安装visualvm
在笔者使用的x86机器上其实已经安装了1.8版本的JDK,但是在使用过程中,出现了各种不顺,下面是其中一个异常:
java.lang.IndexOutOfBoundsException at java.nio.Buffer.checkIndex(Buffer.java:546) at java.nio.DirectByteBuffer.getLong(DirectByteBuffer.java:776) at org.netbeans.lib.profiler.heap.AbstractLongMap$MemoryMappedData.getLong(AbstractLongMap.java:325) at org.netbeans.lib.profiler.heap.AbstractLongMap.getID(AbstractLongMap.java:124) at org.netbeans.lib.profiler.heap.AbstractLongMap.put(AbstractLongMap.java:93) at org.netbeans.lib.profiler.heap.LongMap.put(LongMap.java:247) at org.netbeans.lib.profiler.heap.ClassDumpSegment.createClassCollection(ClassDumpSegment.java:203) at org.netbeans.lib.profiler.heap.HprofHeap.getAllClasses(HprofHeap.java:121) at org.netbeans.lib.profiler.heap.ComputedSummary.(ComputedSummary.java:27) at org.netbeans.lib.profiler.heap.HprofHeap.getSummary(HprofHeap.java:240) at org.netbeans.modules.profiler.heapwalk.HeapWalker.createHeap(HeapWalker.java:157) at org.netbeans.modules.profiler.heapwalk.HeapWalker.(HeapWalker.java:54) at com.sun.tools.visualvm.heapdump.impl.HeapDumpView$MasterViewSupport$1.run(HeapDumpView.java:116) at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:1384)
最终,笔者去visualvm官网下载了一个独立visualvm版本,相比JDK自带的visualvm,自带了很多插件,界面风格也更漂亮~
visualvm官方地址:https://visualvm.github.io(很奇怪,我的笔记本网络打不开这个链接,手机浏览器可以打开并下载visualvm)。此处,也给小伙伴提供一个百度网盘链接地址:
链接:https://pan.baidu.com/s/1Kd5RPXYm-waOFF3TyNdJJQ 提取码:kdkn
2.3 修改jvisualvm运行配置
默认情况下,JDK自带的jvisualvm运行堆内存仅有256m,独立的visualvm默认最大堆内存也不超过1G。在使用JDK自带的jvisualvm时,曾出现如下异常:
根据异常信息提示,肯定是jvisualvm内存不够,但是修改点并不是界面上显示的etc/netbeans.conf,因为在jdk整个目录下都找不到该配置文件。最终,在lib目录下找到一个叫visualvm.conf配置文件,最终找到配置Xmx的地方。
若使用的是独立下载的visualvm,在安装目录etc/visualvm.conf中即可修改。
2.4 启动jvisualvm
使用如下命令启动即可。
jvisualvm
启动后,load需要加载的dump文件
等待加载完毕,界面如下:
至此,就可以去分析应用的内存问题啦~
参考链接
https://blog.csdn.net/tszxlzc/article/details/80779080https://blog.csdn.net/tszxlzc/article/details/80779080