在调优前,需通过工具掌握系统与WebLogic的内存状况,为后续调整提供数据支撑:
free -m查看物理内存与交换空间使用情况;top/htop监控进程内存占用(重点关注WebLogic进程的RES(常驻内存)、%MEM(内存占比));vmstat 1观察内存、交换分区、IO等实时指标(关注si(交换入)、so(交换出)值,过高说明交换空间压力大)。Domain > Servers > [Server Name] > Monitoring > Performance)查看堆内存使用率、非堆内存(如元空间)、线程池内存占用;使用jconsole或VisualVM连接WebLogic进程,深入分析内存池(Eden、Survivor、Old区)、垃圾回收(GC)频率与耗时。调整Linux内核参数,减少内存浪费与交换空间依赖,增强WebLogic内存访问性能:
vm.swappiness:该参数控制内核使用交换空间的倾向(范围0-100,值越小越倾向于使用物理内存)。建议设置为10(生产环境推荐),避免频繁交换导致性能下降。修改方法:echo 'vm.swappiness = 10' | sudo tee -a /etc/sysctl.conf && sudo sysctl -p。vm.dirty_ratio:当系统文件系统脏数据(未写入磁盘的内存数据)占比达到该值时,触发强制写回操作。建议设置为10(默认20),减少写回操作对内存的占用。修改方法:echo 'vm.dirty_ratio = 10' | sudo tee -a /etc/sysctl.conf && sudo sysctl -p。zram/zswap:通过压缩闲置内存页(zram)或将未使用内存页压缩存储到交换分区(zswap),在不增加物理内存的情况下,提升内存利用率。例如,zram配置:sudo modprobe zram && echo 1 | sudo tee /sys/class/zram-control/hot_add && echo 2G | sudo tee /sys/block/zram0/disksize && sudo mkswap /dev/zram0 && sudo swapon /dev/zram0。通过调整JVM堆内存与非堆内存参数,避免内存溢出(OutOfMemoryError)并提升GC效率:
-Xms):设置为物理内存的10%-20%(如8GB物理内存可设为1024m-2048m),避免启动时频繁扩容。-Xmx):设置为物理内存的50%-70%(如8GB物理内存可设为4096m-6144m),不超过物理内存的80%(预留内存给系统与其他进程)。-Xms与-Xmx建议设置为相同值,避免堆内存动态调整带来的性能损耗。-XX:MetaspaceSize/-XX:MaxMetaspaceSize):替代Java 7及之前的永久代,用于存储类元数据。建议-XX:MetaspaceSize=256m(初始大小)、-XX:MaxMetaspaceSize=512m(最大大小),避免元空间溢出。-XX:PermSize/-XX:MaxPermSize):建议-XX:PermSize=256m、-XX:MaxPermSize=512m(若应用使用大量第三方库,可适当增大)。setDomainEnv.sh文件):export MEM_ARGS="-Xms2048m -Xmx2048m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m"
选择合适的GC算法,优化GC参数,降低GC对应用性能的影响:
Parallel GC(-XX:+UseParallelGC,年轻代并行收集,老年代串行收集),适合后台批处理应用。G1 GC(-XX:+UseG1GC,面向服务端应用的低延迟GC),适合高并发Web应用(默认从Java 9开始启用)。-Xmn(年轻代大小,通常为堆内存的1/3-1/2,如-Xmn1024m),避免年轻代过小导致频繁Minor GC。-XX:MaxGCPauseMillis=200(设置最大GC停顿时间为200ms,G1 GC会根据此目标调整堆分区)。-Xloggc:/path/to/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps),通过GCViewer等工具分析GC频率与耗时,针对性调整。内存泄漏是WebLogic性能下降的常见原因,需定期排查与预防:
jconsole观察堆内存使用率,若持续增长且GC无法释放(如Old区内存占比长期高于70%),可能存在内存泄漏。OutOfMemoryError时,自动生成内存Dump文件(通过-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dump.hprof配置),使用Eclipse MAT或VisualVM分析Dump文件,找出占用内存大的对象(如未关闭的数据库连接、缓存未清理的对象)。1MB)。根据应用并发需求,调整ExecuteThreadTotalCPUUsage(CPU使用率阈值,超过则增加线程)、ExecuteThreadTotal(最大线程数,建议设置为CPU核心数*2+1),避免线程过多导致内存耗尽。config.xml中配置内存池(<memory-pool>),减少内存碎片,提高内存分配效率。例如:<memory-management>
<memory-pool>
<name>MyMemoryPool</name>
<capacity>512m</capacity>
<growth-enabled>false</growth-enabled>
</memory-pool>
</memory-management>