AIX+WebSphere+Oracle环境下的OutOfMemoryError解决实战

需积分: 15 1 下载量 61 浏览量 更新于2024-07-24 收藏 847KB DOCX 举报
"本文详细记录了解决was6.1在AIX操作系统和ORACLE数据库环境下遇到的OutOfMemoryError问题的过程,涉及的技术栈包括J2EE、WebSphere Portal Server V6.1以及自有的技术框架。在用户量增加后,服务器崩溃,通过分析日志和heapdump文件,发现内存主要被大量的类对象占用,例如`org.eclipse.osgi.framework.log.FrameworkLogEntry`、`java.lang.Object`、`java.lang.Integer`等。" 在深入解析之前,首先理解`OutOfMemoryError`是Java应用程序中常见的错误,通常发生在系统无法分配足够的内存来执行特定操作时。在这个特定场景中,问题出现在AIX 5.3操作系统上的WebSphere Portal Server V6.1,该服务器同时为两个平台提供服务,其中一个平台的通讯超时问题导致了线程悬挂,最终触发了内存溢出。 为了诊断问题,首先分析了was生成的heapdump文件,使用IBM Heap Analyzer工具。这个工具能帮助识别哪些对象占用了大部分内存。结果显示,`org.eclipse.osgi.framework.log.FrameworkLogEntry`类的对象占据了近1GB的内存,这是一个与OSGi框架相关的日志条目类。这可能表明应用在处理日志时产生了大量未释放的对象,可能是由于异常处理或日志记录策略不当造成的。 此外,`java.lang.Object`、`java.lang.Integer`、`java.lang.System`等基本类型的实例也占用了大量内存。这可能意味着存在大量的对象实例化,或者数据结构设计不合理,比如过多的缓存或者未正确回收的对象引用。 为了解决这个问题,可以采取以下步骤: 1. **优化日志策略**:减少日志级别,避免保存过多的日志条目,或者定期清理日志文件以释放内存。 2. **检查并调整线程池大小**:根据服务器性能和并发需求,合理设置线程池大小,避免线程过度创建。 3. **内存泄漏检测**:使用内存分析工具,如MAT(Memory Analyzer Tool),找出可能导致内存泄漏的对象和引用。 4. **优化数据结构**:检查代码中是否存在大量临时对象的创建,或过度使用集合类,可能导致内存占用过高。 5. **调整JVM内存设置**:根据应用的实际需求,适当增加JVM堆内存(`Xms`和`Xmx`),并调整其他内存池如PermGen(如果是旧版JVM)或Metaspace(如果是Java 8及以上版本)大小。 6. **监控系统资源**:实时监控服务器的CPU、内存和磁盘使用情况,以便及时发现问题。 以上分析和解决方案只是基于给出的部分内容,实际情况可能需要更深入的代码审查和系统调优。在进行任何更改时,应先在非生产环境中进行测试,确保改动不会引入新的问题。对于这种大规模的企业级应用,定期进行性能评估和优化是非常重要的,以确保系统能够稳定地处理日益增长的用户负载。