暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Weblogic诊断之内存泄漏故障

IT那活儿 2022-10-31
1206

点击上方“IT那活儿”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!!

在我们运维工作中经常会遇到内存不足或者内存泄漏的情况,本篇文章简单介绍下遇到这类情况该如何去排查。


概述

当JVM没有足够的堆空间可用于分配新的Java对象时,就会出现Java堆内存不足错误。

1.1 Java堆内存不足故障症状

  • JVM会抛出Java.lang .OutOfMemoryError异常。
  • 服务响应缓慢或不响应业务请求。
  • 应用程序可以忽略错误或处理异常,例如友好退出。
  • 如果应用程序忽略错误,线程将会退出(且将不会出现在Thread dump中)。
  • WebLogic Server的执行线程只是通过记录状态来处理异常。
  • 但连续发生的错误将导致健康监控线程关闭服务器。

1.2 堆内存不足的可能原因

  • 没有足够的堆;
  • 对象的活动时间过长;
  • 应用程序在内存中缓存对象过多;
  • 内存泄漏;
  • 因存在jvm错误未能执行完整的GC;
  • 内存碎片。


排查步骤

2.1 先获取应用进程号
ps  -ef | grep  应用名
2.2 查看pid jvm堆使用情况、垃圾回收情况 
jstat  -gcutil pid 1000 10(时间间隔1000ms,输出10次)
2.3 开启OOM快照(在启动参数里面加)
-XX:+HeapDumpOnOutOfMemoryError(开启堆快照)
-XX:HeapDumpPath=C:/m.hprof(保存文件到哪个目录)

2.4 dump 查看方法栈信息
jstack -l pid > home/test/jstack.txt
2.5 dump 查看JVM内存分配以及使用情况 
jmap -heap pid > home/test/jmapHeap.txt
2.6 dump jvm二进制的内存详细使用情况(需要借用内存分析工具如:Memory Analyzer (MAT)来分析

jmap -dump:format=b,file=/home/test/oom.hprof pid


解决方案

3.1 年老代堆空间被占满
  • 异常:java.lang.OutOfMemoryError:java  heap space
  • 说明:这是最典型的内存泄漏方式,简单说就是所有堆空间都被无法回收的垃圾对象占满,虚拟机再也无法分配新空间。
  • 解决方案:这种方式解决起来比较简单,一般就是根据垃圾回收前后的情况对比,同时根据对象引用情况(常见的集合对象引用)分析,基本都可以找到泄漏点。
3.2 持久代被占满
  • 异常:java.lang.OutOfMemoryError:PermGen space
  • 说明:Perm 空间被占满,无法为新的 class 分配存储空间而引发的异常。主要原因是大量动态反射生成的类不断被加载,最终导致 Perm 区被占满。
  • 解决方案:增加持久代内存 ,例如:-XX:MaxPermSize=512M




本文作者:程 红(上海新炬王翦团队)

本文来源:“IT那活儿”公众号

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论