Ubuntu上WebLogic内存溢出的排查与处置
一、快速定位与应急
- 确认异常类型与触发点:查看 AdminServer 与受管 Server 的 logs 目录(如:…/user_projects/domains/<你的域>/servers/AdminServer/logs),从 OutOfMemoryError 消息判断是 Java heap space、Metaspace、PermGen(旧版本)还是 native/malloc 失败;同时关注是否伴随 Full GC 频繁、线程卡死等迹象。必要时优先保留现场(不要立即重启),以便抓取诊断数据。
- 抓取诊断数据:在 setDomainEnv.sh 中临时开启堆转储与JVM崩溃日志,便于后续分析:
- 堆转储:在 JAVA_OPTIONS 增加 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/weblogic/dumps
- 崩溃日志:增加 -XX:+CrashOnOutOfMemoryError(可选,便于定位 native 问题)
触发 OOM 后,到指定目录获取 .hprof 堆转储文件。
- 现场保留与临时缓解:
- 保留最近一次 heapdump、gc.log、server.log、nohup.out;
- 临时缓解可先重启问题 Server,并适当下调业务并发或批量处理规模,避免再次快速打满堆。
- 系统层面快速体检(Ubuntu):
- 资源使用:
top/htop、free -m、vmstat 1 60、iostat -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 MAT 或 VisualVM 打开 .hprof,查看 Dominator Tree、Histogram、Thread 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/网络)与应用指标,设置告警阈值,提前发现异常。