您的位置 首页 java

WAS 环境下大文件下载内存溢出问题处理

1.问题说明:

某E-Leanring项目按验收要求由 Tomcat 环境迁移至IBM websphere 6.1环境后,多次出现应用服务器宕机重启的问题,影响系统使用。

2.日志分析

在WAS的Profiles目录下已存在大量的javacore和heapdump文件,经过查看javacore文件发现存在如下内容:

Free java heap size: 0

由应用服务器的业务日志中发现如下内容

Exception = java. lang .OutOfMemoryError

Source = com.ibm.ws.webcontainer. servlet .ServletInstance.service

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.解决手段

经查相关文档,Wesphere6.0及6.1下载大文件时,会将文件读取到jvm,导致jvm发生内存溢出现象,对于websphere曾出现过内存溢出,并且存在文件下载情况的,建议设置以下参数:应用程序服务器->server1-> web容器 ->定制属性,输入”com.ibm.ws.webcontainer.channelwritetype “值”sync”

按上述步骤设置该参数后。同时下载4个700M课件,系统JVM堆大小无明显增长,系统正常访问,问题得以解决。

5.其它建议

1)按照IBM的建议,静态文件的下载应该交由webserver,而不是appserver去负责。建议在未来的系统设计中加以调整。

2)原有系统JVM堆最小值1024M,最大值1048M相对于IBM JDK的“标记”-“清除”的GC工作方式来说不是特别合理。建设在32位环境下JVM最小堆和最大堆分别设置为256M和1024M并设置-Xk30000参数减少内存碎片产生。

文章来源:智云一二三科技

文章标题:WAS 环境下大文件下载内存溢出问题处理

文章地址:https://www.zhihuclub.com/180176.shtml

关于作者: 智云科技

热门文章

网站地图