1.问题说明:
某E-Leanring项目按验收要求由Tomcat环境迁移至IBM web环境后,多次出现应用服务器宕机重启的问题,影响系统使用。
2.日志分析
在WAS的Profiles目录下已存在大量的javacore和heapdump文件,经过查看javacore文件发现存在如下内容:
Free java heap size: 0
由应用服务器的业务日志中发现如下内容
Exception = java.lang.OutOfMemoryError
Source = com.ibm.ws.webcon
probeid = 290
Stack Dump = java.lang.OutOfMemoryError: unable to allocate 562304 bytes for native buffer
由上述问题判断系统发生了JVM内存溢出导致应用服务器重启。
3.故障定位
设置JVM堆最大值为1024m,启动后系统占用JVM堆内存约为600M,分别下载一个200M课件和一个700M课件,使用Jprofiler工具监控JVM内存使用情况。
下载完200M课件后,系统可以正常访问,JVM堆使用增加200M。
下载700M课件过程中,系统发生内存溢出,应用服务器无法访问,Jprofiler无法进行监控。
由上述现象分析,WAS在用户下载课件文件时,尝试将整个课件文件全部调入JVM后再推送给用户,导致JVM内存溢出。
4.解决手段
经查相关文档,We及6.1下载大文件时,会将文件读取到jvm,导致jvm发生内存溢出现象,对于websphere曾出现过内存溢出,并且存在文件下载情况的,建议设置以下参数:应用程序服务器->server1->web容器->定制属性,输入"com.ibm.ws.webcon "值"sync"
按上述步骤设置该参数后。同时下载4个700M课件,系统JVM堆大小无明显增长,系统正常访问,问题得以解决。
5.其它建议
1)按照IBM的建议,静态文件的下载应该交由webserver,而不是appserver去负责。建议在未来的系统设计中加以调整。
2)原有系统JVM堆最小值1024M,最大值1048M相对于IBM JDK的“标记”-“清除”的GC工作方式来说不是特别合理。建设在32位环境下JVM最小堆和最大堆分别设置为256M和1024M并设置-Xk30000参数减少内存碎片产生。