Linux上WebLogic内存管理
小樊
41
2025-12-14 11:49:35
Linux上WebLogic内存管理
一 内存架构与关键概念
- WebLogic运行在JVM之上,内存分为:
- 堆内存 Heap:对象实例存储,由**-Xms/-Xmx**控制;年轻代/老年代比例影响GC频率与停顿。
- 非堆内存 Non-Heap:包含Metaspace(Java 8+)或PermGen(Java 7-)、线程栈、JNI、Direct Memory等。
- 在Linux上还需关注Native Memory(glibc分配器、线程栈、mmap、JNI等),它不在JVM堆内,但计入进程RES。
- 常见现象:JVM堆使用正常,但系统RES/VIRT持续增长,多与glibc Arena分配器或多线程mmap有关。
二 JVM堆与GC配置要点
- 堆大小与比例
- 生产环境建议**-Xms == -Xmx**,避免运行期扩缩堆带来的抖动。
- 堆一般不超过物理内存的70%,为操作系统和其他进程预留资源。
- 年轻代建议为堆的1/3~1/2,如:-Xmn。
- 代际比例与GC选择
- 吞吐优先可用并行GC:-XX:+UseParallelGC -XX:+UseParallelOldGC。
- 低延迟可用G1(Java 8+):-XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:G1ReservePercent=15 -XX:InitiatingHeapOccupancyPercent=35。
- 超大堆与极低停顿(Java 11+):-XX:+UseZGC 或 -XX:+UseShenandoahGC。
- 元空间(Java 8+)
- 默认无上限,建议设置上限防止类加载泄漏:-XX:MetaspaceSize=… -XX:MaxMetaspaceSize=…。
- 诊断与稳定性参数
- OOM时留证:-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=…
- GC日志:-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/path/gc_%t.log
- 避免显式GC:-XX:+DisableExplicitGC
- 示例(按服务器内存规划,仅示意)
- 16GB物理内存:
- -Xms8g -Xmx8g -Xmn4g -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1g
- -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:G1ReservePercent=15
- -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/weblogic/heapdumps
- -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/opt/weblogic/logs/gc_%t.log
- 32GB物理内存:
- -Xms16g -Xmx16g -Xmn8g -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1g
- 其余GC/诊断参数同上,按并发与延迟目标微调。
三 在WebLogic中设置JVM参数
- 方式一(推荐):编辑域目录下的**$DOMAIN_HOME/bin/setDomainEnv.sh**,设置USER_MEM_ARGS
- 示例:
- USER_MEM_ARGS=“-Xms8g -Xmx8g -Xmn4g -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/weblogic/heapdumps”
- export USER_MEM_ARGS
- 方式二:管理控制台
- 进入环境 → 服务器 → 目标服务器 → 配置 → 服务器启动,在“参数”字段追加JVM参数。
- 生效方式:重启目标服务器实例。
四 Linux系统与Native内存优化
- glibc Arena导致的RES膨胀
- 现象:进程RES持续上涨,但堆使用正常;pmap可见大量64MB匿名映射块。
- 处置:
- 限制Arena数量:export MALLOC_ARENA_MAX=4(glibc 2.12等老版本存在生效限制,必要时升级glibc)。
- 替换分配器:使用tcmalloc/jemalloc(如LD_PRELOAD),实践中常能显著降低RES占用。
- 内核与交换策略
- 适度降低换页倾向:vm.swappiness=10(减少不必要的swap抖动)。
- 脏页回写阈值:vm.dirty_ratio=100(视负载与I/O能力调整,避免抖动)。
- 系统监控与定位
- 系统层:free -m、top/htop、/proc/meminfo、slabtop
- JVM层:jstat -gc 1000、jmap -heap 、jstack
- 堆外线索:pmap -x | sort -nk3 观察匿名映射与增长趋势。
五 监控指标与排错流程
- 关键指标
- 堆使用率建议低于70%;Young GC应快速,Full GC极少。
- Metaspace使用不应持续增长(设上限后更应稳定)。
- 系统层关注RES/VIRT、swap、I/O等待。
- 排错流程
- 建立基准 → 只调整1–2个参数 → 压测验证 → 复盘监控指标。
- OOM时:获取Heap Dump与GC日志,结合jstat/jmap/jstack定位对象膨胀、线程/锁竞争、Direct Memory或JNI问题。
- 堆外膨胀:检查Arena与mmap增长,尝试MALLOC_ARENA_MAX或tcmalloc/jemalloc,并用pmap/perf/火焰图深入分析。
- 配置示例(中小型应用,4–8GB堆)
- JAVA_OPTIONS=“-Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/weblogic/heapdumps”"