当前位置:首页 > 内存 > 正文

堆内存溢出解决方案

  • 内存
  • 2024-07-28 18:30:45
  • 729

一、记一次线上内存溢出问题排查过程业务反馈后台管理页面打不开,报错。通过后台日志发现zookeeper无法连接,找不到dubbo服务提供者。因为当时ZooKeeper出现了无法连接其他线上服务的问题,导致内存溢出,日志中出现了OutOfMemory错误,所以我直接去服务器查看内存使用情况。使用ps-ef|grepjava命令查出Java进程号,然后使用jmap-heappid命令查看jvm堆内存使用情况如下:
可以看到,堆内存使用率为100%。
现在我们知道服务因内存溢出而崩溃,我们需要导出堆内存映像进行分析。使用ps-ef|grepjava命令查看堆内存溢出时维护的日志文件路径。这里说一下,启动java程序的时候需要添加一个参数,这样当堆内存溢出的时候就会自动生成hprof文件。参数:-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath=文件路径。获取堆内存镜像后,尽快重启并恢复线上服务。接下来就是我的分析过程使用EclipseMemoryAnalysisTools(MAT)来进行分析。第一次在MacOS上使用该工具时出现两个小问题:
1打开工具时出现错误,TheplatformmetadataareaCouldnotbewriting:/private/var/folders/8m/tgf解决方案:右键mat工具显示包内容,搜索MemoryAnalyzer并修改,添加参数:-data下一行是数据保存路径
2打开镜像文件时,出现错误:Aninternallerrooccurredduring:".ParsingheapdumpfromXXX,因为我的镜像文件有2G多,但是这个文件中的MemoryAnalyzer参数-Xmx1024m默认只有1G,所以修改这个参数为-Xmx4096m
成功打开文件后,选择查看LeakSuspectsReport并自动分析可能泄漏的对象,如下所示:


二、spark内存溢出及其解决方案1.您在工作中遇到过内存溢出问题吗?你是怎么解决的?
回答思路:先解释一下spark的内存模型,然后介绍不同情况下的解决方案。总体思路是根据内存模型判断哪部分内存不足,要么增加该部分,要么整体增加。
oom通常出现在执行内存中,因为存储内存满后,内存中的旧数据会被直接丢弃,对性能影响较小,但不会造成oom。存储内存和执行内存可以互相借用内存空间。
spark的OOM问题主要分为三种情况:
①map执行后内存溢出
--场景:maptask运行Executor内存溢出。
当增加堆内内存时,使用的堆外内存也会增加
--executor-memory
增加-heap-memory
overhead2048
用于堆外内存的默认值是Executor内存的10%。
②随机排序后内存溢出
减少任务去地图检索数据并同时收集。减少端有聚合内存,执行内存*0.2
解决方案:增加减少聚合内存的分数,设置fraction
增加大小执行内存
减少reducetask每次拉取的数据量,设置eInFlight24m
③驱动内存溢出
--场景1:用户在Dirver端口对象上生成大量数据,例如创建大集合的数据结构
解决方案:Ⅰ将大对象转换为Executor端加载,例如调用sc。textfile
Ⅱ考虑使用大内存对象,增大dirver-menory的值
--场景2:从Executor端收集数据(collect)回给Dirver端
解决方案:Ⅰ不建议传输大数据,数据是从executor端收集的。建议将driver端对collect返回的数据的操作转为executor端RDD操作
   Ⅱ如果无法避免,估计collect需要的内存,增大该值driver内存相应
--场景3:被spark自己的框架消耗
主要被sparkUI数据消耗,取决于作业的累计任务数
解决方案:Ⅰ从hdfsload自动计算分区,但经过过滤后,数据量已经大大减少,此时可以减少分区。
   Ⅱ由参数edStages/edjobs控制(默认1000)
2.未找到随机播放文件错误的原因可能是什么?
出现此错误的原因可能是下一步的任务从上一步的任务所在的执行器中取数据,但是上一步进行了GC,导致数据没有通道拉,就出现这个错误。可以通过调整移动次数和间隔来避免这种情况。
valconf=newSparkConf()
.set("ries","6')
.set("ait","60s")
3.堆栈溢出?
在yarnclient模式下,Dirver运行在本机,spark的permGen使用的jvm为128m在客户端测试时可以没有问题
Dirver运行在集群中未配置的节点上。运行时PermGen永久代大小为82m以上extraJavaOptions="-xx:PerSize=128M-xx:MaxPermSize=256m"