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 中少数对象/类加载器占比异常高。
- 案例:使用 Hibernate 的 StatefulPersistenceContext 在长事务/大批量处理中缓存膨胀引发 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 Server 的 logs/ 目录(如 Server.log、gc.log),定位异常类型与时间点。
- 系统:使用 top、free -m、vmstat 观察内存与 swap 使用、是否存在系统层 OOM-killer。
- JVM 工具:用 jstat -gc、jstack 观察 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 策略,必要时横向扩容或拆分业务域。