温馨提示×

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 DumpGC日志,结合jstat/jmap/jstack定位对象膨胀、线程/锁竞争、Direct Memory或JNI问题。
    • 堆外膨胀:检查Arenammap增长,尝试MALLOC_ARENA_MAXtcmalloc/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”"

0