温馨提示×

Ubuntu上WebLogic内存溢出怎么办

小樊
43
2025-12-10 18:41:08
栏目: 智能运维

Ubuntu上WebLogic内存溢出的排查与处置

一、快速定位与应急

  • 确认异常类型与触发点:查看 AdminServer 与受管 Server 的 logs 目录(如:…/user_projects/domains/<你的域>/servers/AdminServer/logs),从 OutOfMemoryError 消息判断是 Java heap spaceMetaspacePermGen(旧版本)还是 native/malloc 失败;同时关注是否伴随 Full GC 频繁、线程卡死等迹象。必要时优先保留现场(不要立即重启),以便抓取诊断数据。
  • 抓取诊断数据:在 setDomainEnv.sh 中临时开启堆转储与JVM崩溃日志,便于后续分析:
    • 堆转储:在 JAVA_OPTIONS 增加 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/weblogic/dumps
    • 崩溃日志:增加 -XX:+CrashOnOutOfMemoryError(可选,便于定位 native 问题)
      触发 OOM 后,到指定目录获取 .hprof 堆转储文件。
  • 现场保留与临时缓解:
    • 保留最近一次 heapdumpgc.logserver.lognohup.out
    • 临时缓解可先重启问题 Server,并适当下调业务并发或批量处理规模,避免再次快速打满堆。
  • 系统层面快速体检(Ubuntu):
    • 资源使用:top/htopfree -mvmstat 1 60iostat -x 1 60
    • 若怀疑系统 OOM Killer 介入:dmesg -T | grep -i 'oom\|kill',必要时调整关键进程的 oom_score_adj,避免 WebLogic 被优先终止。

二、常见根因与对应处置

  • 堆空间不足或 GC 策略不当:应用对象生命周期管理不佳或峰值对象过多导致 Java heap space。处置:合理设置 -Xms/-Xmx,结合负载选择并调优 GC 算法(如 G1/ZGC),并通过 VisualVM/JConsole 持续观察 Eden/Survivor/Old 区与 GC 停顿。
  • 元空间 Metaspace/旧版 PermGen 不足:类加载过多、热部署频繁导致 Metaspace/PermGen 溢出。处置:升级到 JDK 8+ 并使用 -XX:MaxMetaspaceSize 合理上限;旧版本可适度增大 -XX:MaxPermSize(示例:512M)。
  • 应用层内存泄漏:如 Hibernate 一级缓存(StatefulPersistenceContext) 在长事务/大批量处理中持续累积对象,最终压垮堆。处置:在业务关键点显式调用 session.evict(entity) / session.clear(),缩短长事务,拆分大批次任务。
  • 线程与本地内存问题:出现 “getNewTla” 等线程分配失败,常与 WebLogic 工作线程/执行队列 或本地内存紧张相关。处置:优化 线程池/WorkManager 配置,控制并发;排查本地缓存、NIO 直接缓冲等本地内存占用。
  • 数据库/SQL 导致对象膨胀:大量结果集、低效 SQL、缺少分页或流式处理,导致对象在堆中长期驻留。处置:优化 SQL、加索引、分页/游标、流式读取,必要时做 表分区/SQL 重构

三、JVM与WebLogic参数建议

  • 堆与元空间(示例,按机器内存与负载调整):
    • -Xms4g -Xmx4g(建议与物理内存匹配,避免设置过大导致 GC 停顿过长或系统换页)
    • -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m(旧版 JDK 可用 -XX:MaxPermSize=512m
    • 开启诊断:-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/weblogic/dumps
  • GC 选择:
    • JDK 8:-XX:+UseG1GC(大堆、低延迟场景优先)
    • JDK 11+:可考虑 ZGC(极低停顿)
  • WebLogic 层:
    • 通过 Administration Console / WLST 调整 线程池(Execute Threads)JDBC 连接池(Initial/Max Capacity、Statement Cache),避免连接/语句泄漏;
    • 控制 热部署/自动部署 频率,减少 Metaspace 压力。

四、堆转储分析与修复闭环

  • 分析工具与步骤:
    • 使用 Eclipse MATVisualVM 打开 .hprof,查看 Dominator TreeHistogramThread Overview
    • 定位占用最高的对象与 GC Root 引用链,识别泄漏根因(如缓存未清理、静态集合膨胀、会话/连接未关闭)。
  • 修复与回归:
    • 针对泄漏点修复代码(关闭资源、清理缓存、拆分事务/批次、优化查询);
    • 回归压测并持续监控 GC 次数/停顿、Heap/Meta 使用、线程与连接数,确认问题消除。

五、Ubuntu系统层面的稳定性优化

  • 资源与调度:
    • 使用 cgroups 限制 WebLogic 资源上限,避免无界扩张影响其他服务;
    • 通过 nice/renice/cgroups 调整优先级,保障关键业务稳定。
  • 内存与 I/O:
    • 适度使用 zram/zswap 缓解内存紧张时的换页抖动;
    • 监控 vmstat/iostat/iotop,优化磁盘与文件系统(如 ext4/xfs)参数。
  • 监控体系:
    • 构建 Prometheus + Grafana 监控 JVM(堆/GC/线程)、系统(CPU/内存/IO/网络)与应用指标,设置告警阈值,提前发现异常。

0