CentOS上WebLogic内存溢出的定位与解决
一、快速判断与定位
- 确认异常类型:查看 WebLogic 服务器日志与 stdout/stderr。若日志中出现 java.lang.OutOfMemoryError: Java heap space,多为Java堆不足;若提示 native OutOfMemoryError 或进程被 SIGABRT 终止,多为堆外/本地内存不足(如线程栈、Direct Memory、JNI、第三方本地库等)。同时检查 AdminServer 日志目录:…/user_projects/domains/<你的域>/servers/AdminServer/logs。
- 打开GC日志以判断是配置不足还是泄漏:在启动参数中加入
-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:/path/gc_.log,用 HPJmeter/GCViewer 等工具查看 GC 频率与回收效果。稳定性测试中,若 GC/Full GC 时间占比 > 5% 或 Full GC 后堆使用仍呈线性增长,通常意味着配置不合理或存在泄漏。
- 初步判定后,再决定是“调参扩容”还是“查泄漏/堆外占用”。
二、Java堆溢出 Java heap space 的处理
- 合理设置堆大小:在 setDomainEnv.sh 或管理控制台“服务器启动”中设置 -Xms 与 -Xmx(建议两者等值,避免运行期扩缩堆带来的抖动),例如 -Xms2g -Xmx2g。一般应用可先给到 2G,大型应用可到 4G 或更高,再结合 GC 日志与压测微调。
- 生成并分析堆转储:在 OOM 时生成 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/dump.hprof,用 Eclipse MAT 分析支配树与泄漏疑点。
- 调整新生代与回收器:通过 -XX:NewRatio=N 调整新生代/老年代比例;在 JDK 8 可评估 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC(低延迟场景),并持续用 jstat/jconsole/VisualVM 观察停顿与回收效果。
- 应用侧治理:重点排查会话膨胀、缓存无界增长、未关闭资源(JDBC Statement/ResultSet、JNDI、JMS 等),并优化线程池与连接池配置,避免对象长期驻留堆内。
三、堆外内存与系统层面的排查与优化
- 识别堆外问题:若 OOM 消息出现在 stdout/stderr 且伴随 native OutOfMemoryError 或 SIGABRT,或观察到 RSS 接近/超过物理内存+Swap、进程虚拟内存持续增长,多为堆外问题(线程栈、Direct Memory、JNI、mmap、第三方本地库等)。
- 系统资源与参数:
- 适度降低 vm.swappiness(如 10),减少换页;必要时调整 vm.dirty_ratio 等脏页回写参数。
- 检查 ulimit -u/-v(进程/虚拟内存上限)、容器/虚拟化配额;必要时提升或优化部署拓扑。
- 监控 RSS/VSZ 与 GC 日志并行观察,确认是否“堆外持续增长”。
- 代码与依赖:排查 JNI/本地库、第三方驱动、代理类加载器泄漏、Direct ByteBuffer 使用不当等。
四、可直接套用的参数示例与落地步骤
- 示例(JDK 8,HotSpot,放在 setDomainEnv.sh 的适当位置,如 WLS_MEM_ARGS_64BIT 区段):
- 堆与GC:
- -Xms2g -Xmx2g
- -XX:NewRatio=2
- -XX:+UseConcMarkSweepGC -XX:+UseParNewGC
- -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:/opt/weblogic/domains/mydom/servers/mSrv1/logs/gc_mSrv1.log
- -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/weblogic/domains/mydom/servers/mSrv1/logs/heapdump.hprof
- 说明:若使用 JDK 11+,-XX:PermSize/MaxPermSize 已移除,元空间由 -XX:MetaspaceSize/-XX:MaxMetaspaceSize 控制;CMS 在新版本可能不可用,需改用 G1/ZGC。
- 落地步骤:
- 备份并编辑 setDomainEnv.sh;2) 重启受影响的 AdminServer/受管服务器;3) 复现问题并收集 GC 日志/堆转储;4) 用 MAT/HPJmeter 分析并优化代码或参数;5) 回归压测,确认 GC 时间占比 < 5% 且无持续增长趋势。