温馨提示×

Linux系统WebLogic内存溢出解决

小樊
33
2025-12-24 08:03:50
栏目: 智能运维

Linux下WebLogic内存溢出定位与解决

一、快速判断与应急

  • 识别异常类型(看Server日志与控制台):
    • Java heap space:堆内存不足,常见于对象生命周期过长、缓存膨胀或内存泄漏。
    • PermGen space:永久代不足,常见于频繁热部署导致类加载器无法回收(JDK 7 及更早)。
    • Metaspace:元空间不足,JDK 8+ 使用 Metaspace 替代 PermGen。
    • GC overhead limit exceeded:JVM长时间GC但回收效果差,多为内存泄漏或堆过小。
  • 立即缓解(治标):
    • 重启受影响的 Managed Server 或整个域(先隔离再操作,避免业务雪崩)。
    • 临时调大堆与元空间(见下文参数模板),为排查争取时间。
    • 降低一次性加载的数据量(分页、流式、批处理),关闭不必要的后台任务。

二、根因与对应处置

  • 应用代码或框架导致的内存泄漏

    • 现象:重启后内存仍快速攀升,Heap Dump 中少数对象/类加载器占比异常高。
    • 案例:使用 HibernateStatefulPersistenceContext 在长事务/大批量处理中缓存膨胀引发 OOM;或某业务对象被反复创建未释放(如 DefectQueryVO 达百万级实例)。
    • 处置:优化长事务与批量处理;在合适边界显式清理会话缓存(如 session.evict() / session.clear());修复代码级泄漏(缓存、静态集合、监听器等)。
  • 频繁热部署/类加载器泄漏

    • 现象:多次部署后 PermGen/Metaspace 持续增长,出现 OutOfMemoryError: PermGen space
    • 处置:修复应用导致的类加载器泄漏(确保旧类加载器可达对象可被回收);在过渡期适度增大 PermGen/Metaspace 并减少热部署频率。
  • JVM/GC 参数不当或物理资源不足

    • 现象:Full GC 频繁、停顿过长或系统内存紧张。
    • 处置:结合负载合理设置堆与元空间、选择合适的 GC 策略;必要时扩容物理内存或优化系统配置。

三、参数与配置模板

  • 设置位置
    • 编辑域目录下的 bin/setDomainEnv.sh(Linux),在相应条件分支中设置 JAVA_OPTS;避免重复追加,建议先清理旧参数。
  • 常用参数模板
    • JDK 7 及更早(存在 PermGen):
      • 堆:-Xms2g -Xmx2g
      • 永久代:-XX:PermSize=256m -XX:MaxPermSize=512m
    • JDK 8+(使用 Metaspace,无 PermGen):
      • 堆:-Xms2g -Xmx2g
      • 元空间:-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m
    • GC 建议(示例,按负载与版本选择):
      • JDK 8:-XX:+UseG1GC -XX:MaxGCPauseMillis=200
      • JDK 11+:可评估 ZGC 或 Shenandoah(需 JDK 支持与平台验证)
  • 注意
    • 堆与元空间大小需小于物理内存并预留给 OS Page Cache 与其他进程;容器/虚拟化环境需遵循宿主机限制。
    • 修改后重启,验证启动日志中参数是否生效。

四、诊断步骤与工具

  • 收集证据
    • 日志:查看 AdminServer 与 Managed Serverlogs/ 目录(如 Server.log、gc.log),定位异常类型与时间点。
    • 系统:使用 top、free -m、vmstat 观察内存与 swap 使用、是否存在系统层 OOM-killer。
    • JVM 工具:用 jstat -gcjstack 观察 GC 频率与线程状态;必要时抓取 Heap Dump/Thread Dump
  • 分析要点
    • 堆 OOM:用 MAT/JVisualVM 分析 dominator tree、重复实例数与 GC root 路径,定位泄漏源。
    • 元空间 OOM:检查类加载器数量与类重复加载,排查热部署泄漏。
    • GC 异常:结合停顿时间与回收效果,决定是调参还是修复内存使用模式。

五、落地清单

  • 明确 JDK 版本与堆/元空间基线(如 -Xms/-Xmx-XX:MaxMetaspaceSize),并固化到 setDomainEnv.sh
  • 建立监控与告警:GC 日志、堆使用、线程数、服务器响应时延;异常时自动采集 Heap/Thread Dump
  • 规范发布:减少频繁热部署,蓝绿/灰度发布,发布前清理会话与缓存,发布后回归验证内存曲线。
  • 代码治理:排查集合/缓存滥用、长事务与批量处理边界、静态引用与监听器泄漏;对 Hibernate 场景在合适边界调用 evict/clear
  • 容量规划:结合峰值并发与对象生命周期,合理设置堆/元空间与 GC 策略,必要时横向扩容或拆分业务域。

0