Linux上 WebLogic 内存管理实操指南
一 关键概念与容量边界
- 堆与非堆:堆由 -Xms/-Xmx 控制,非堆包含 Metaspace(JDK 8 及以前为 PermGen)、Direct Memory(NIO 堆外) 等。堆外内存不受 -Xmx 限制,但受系统可用内存与容器/OS 限制。
- 代际划分:堆分为年轻代与老年代,年轻代常用 -Xmn 或 -XX:NewRatio 控制;年轻代过小会导致频繁 Minor GC,过大则老年代回收压力上升。
- 回收器选择:JDK 8 常用 Parallel GC 或 CMS;JDK 11+ 推荐 G1 GC;JDK 17+ 可考虑 ZGC 或 Shenandoah(需验证与中间件兼容性)。
- 容量边界:32 位 JVM 单进程堆通常限制在约 1.5–2 GB;64 位 JVM 受物理内存、虚拟内存与容器配额共同约束。设置 -Xms = -Xmx 可减少运行期扩缩堆带来的抖动。
二 在 Linux 上设置 WebLogic 内存
- 推荐做法(通用):编辑域目录 $DOMAIN_HOME/bin/setDomainEnv.sh,通过 MEM_ARGS 设置堆与关键非堆参数,重启生效。示例(仅示意,按实际调整):
- JDK 8(示例):
MEM_ARGS=“-Xms8g -Xmx8g -Xmn2g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -XX:MaxDirectMemorySize=2g”
- JDK 11+(示例,G1):
MEM_ARGS=“-Xms8g -Xmx8g -Xmn2g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:InitiatingHeapOccupancyPercent=45 -XX:MaxDirectMemorySize=2g”
说明:
- 将 -Xms 与 -Xmx 设为相同,避免运行期扩缩堆带来的停顿。
- -Xmn 建议约为 -Xmx 的 1/4(如 8G 堆配 2G 年轻代),再按 GC 日志与停顿目标微调。
- JDK 8 使用 Metaspace 替代 PermGen;JDK 8 之前才使用 -XX:MaxPermSize。
- 如应用大量使用 NIO/DirectBuffer,显式设置 -XX:MaxDirectMemorySize(常见 1–2GB,视负载而定)。
- 控制台方式(WebLogic 12c 及以上):登录控制台,进入 环境 > 服务器 > 目标服务器 > 服务器启动,在 Java 虚拟机 选项中填写 Initial Heap Size 与 Maximum Heap Size,保存并重启。
- 生效验证:重启后在控制台或启动日志中确认参数已生效;必要时用 jcmd VM.flags 或 jinfo -flags 查看。
三 Linux 系统层优化与 OOM 防护
- 资源与监控:使用 top/htop、vmstat、iostat、sar 持续观察内存、CPU、I/O;必要时用 cgroups 对 WebLogic 进程做内存/CPU 限额,避免“吵闹邻居”。
- 交换与内存压缩:适度降低 vm.swappiness(如 10)以减少换页;在内存紧张场景可启用 zram/zswap 提升短时峰值下的稳定性。
- 文件描述符与网络:提升进程可打开文件数(如 ulimit -n 65535,并在 /etc/security/limits.conf 持久化);按需优化 TCP 参数(如 net.ipv4.tcp_tw_reuse、net.ipv4.tcp_fin_timeout)以缓解连接风暴。
- OOM 防护:通过 /proc//oom_score_adj 调整 WebLogic 进程的 OOM 优先级,避免关键实例被优先终止;同时保留合理的 swap 作为缓冲。
- 变更原则:所有系统级参数先在测试环境验证,逐步推广,变更后持续观察 GC 日志、应用 RT、系统负载。
四 监控 诊断与常见误区
- 监控与诊断工具:
- JVM 层:jstat -gc/-gccapacity、jstack、VisualVM/JConsole、Async Profiler(定位热点与内存分配路径)。
- WebLogic 层:控制台监控、诊断框架(如 WLDF),结合 GC 日志 与 停顿时间 评估回收效果。
- 常见问题与修正:
- 堆外 OOM(Direct Memory):检查 -XX:MaxDirectMemorySize 与 NIO/Netty/文件缓存使用;必要时增大或优化应用对堆外内存的使用。
- Metaspace OOM(JDK 8 为 PermGen):逐步增大 -XX:MaxMetaspaceSize,排查类加载泄漏(第三方库、动态生成类等)。
- 频繁 Full GC:适当增大堆或年轻代、优化对象生命周期、减少大对象短期存活;选择合适的 GC 策略与目标停顿。
- 误区:
- 仅调大 -Xmx 而不控对象生命周期与 GC 策略,常导致更长的停顿而非提升吞吐。
- 在 32 位 环境追求大堆(>2GB)不可行,应迁移至 64 位 或拆分集群。
- 忽视堆外内存与容器/OS 限制,导致系统层 OOM 先于 JVM OOM。