1. 诊断内存溢出根源
首先需要定位内存溢出的具体原因(如内存泄漏、堆空间不足、代码问题等),这是解决问题的核心前提。
ps -ef | grep 应用名
命令获取WebLogic应用的进程ID(PID),这是后续监控和分析的基础。jstat -gcutil PID 1000 10
命令(间隔1秒输出10次),查看堆内存各区域(Eden、Survivor、Old区)的使用率及垃圾回收(GC)频率。若Old区使用率持续接近100%且GC频繁,说明堆空间不足;若Survivor区对象长期存活,可能存在内存泄漏。/home/weblogic/user_projects/domains/base_domain/bin/startWebLogic.sh
),添加-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/heapdump.hprof
参数。当发生OutOfMemoryError
时,会自动生成堆转储文件(heapdump.hprof),包含内存中所有对象的快照,用于后续分析。jstack -l PID > /path/to/jstack.txt
命令获取线程堆栈信息,检查是否有死锁、线程阻塞或长时间运行的线程;使用jmap -heap PID > /path/to/jmapHeap.txt
命令查看JVM内存分配详情(如堆大小、元空间使用情况)。2. 调整JVM内存参数
根据应用的内存需求和系统资源,合理配置JVM堆内存及元空间参数,避免因内存不足导致溢出。
startWebLogic.sh
),调整以下参数:
-Xms
:初始堆内存大小(如-Xms1024m
,表示初始分配1GB堆内存);-Xmx
:最大堆内存大小(如-Xmx2048m
,表示最大允许使用2GB堆内存)。建议-Xms
与-Xmx
设置为相同值,避免堆内存动态扩展带来的性能损耗。-XX:MaxMetaspaceSize
(JDK 8及以上):元空间最大大小(如-XX:MaxMetaspaceSize=512m
),防止元空间无限增长导致溢出(JDK 8前为-XX:MaxPermSize
)。-XX:+UseG1GC
参数开启,并调整GC相关参数(如-XX:MaxGCPauseMillis=200
设置最大GC停顿时间),提升GC效率,减少因GC导致的应用暂停。3. 优化应用代码
内存泄漏是导致内存溢出的常见原因,需通过代码审查和优化,减少不必要的内存占用。
try-with-resources
语句自动管理资源(如try (Connection conn = dataSource.getConnection()) { ... }
)。ScheduledExecutorService
定时执行缓存清理任务)。static Map<Object, Object> cache
)、未关闭的资源、监听器未注销等问题,及时修复。4. 增加系统资源
若应用内存需求超过服务器现有资源,需通过硬件升级或虚拟内存扩展提升系统容量。
fallocate -l 2G /swapfile
创建2GB Swap文件,然后通过chmod 600 /swapfile
设置权限、mkswap /swapfile
格式化、swapon /swapfile
启用,缓解内存压力。5. 监控与持续优化
建立长效监控机制,及时发现内存使用异常,避免问题复发。
top
、free -m
命令或Zabbix、Prometheus等监控工具,实时查看系统内存占用、WebLogic进程内存使用情况及GC频率,设置内存使用阈值告警(如当Old区使用率超过80%时触发告警)。server.log
)和系统日志(如/var/log/syslog
),关注OutOfMemoryError
、GC频繁等异常信息,及时处理潜在问题。