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频繁等异常信息,及时处理潜在问题。