今天新能测试组的同事找我看一个奇怪的现象。一个tomcat应用,里面只有一个单纯的jsp页面,而且这个jsp页面没有任何java代码(想用这个jsp页面测试在她的服务器上的一个tomcat的最大QPS)。但是用loadrunner压测了几分钟之后,分配了1024M堆内存的tomcat居然包heap space outofmemory!这个页面的代码如下: 代码如下: <%@ page language=”java” contentType=”text/html; charset=ISO-8859-1″ pageEncoding=”ISO-8859-1″%> <!DOCTYPE html 这个问题涉及到Java Web开发中的JSP页面、Tomcat服务器、内存管理和压力测试几个关键知识点。让我们深入理解问题出现的原因,然后探讨解决方案。 在描述中提到的现象是,一个纯HTML的JSP页面在LoadRunner进行压力测试时,尽管没有包含任何Java代码,仍然导致了Tomcat服务器的内存溢出(Heap Space OutOfMemoryError)。正常情况下,一个简单的JSP页面仅会生成一个对应的Java类,然后被编译为.class文件并加载到内存的Permanent Generation( PermGen)空间。然而,问题并不发生在PermGen空间,而是Heap Space,这通常与对象实例的创建和管理有关。 进一步分析发现,问题在于每次请求该JSP页面时,Tomcat都会默认创建一个session对象。这是因为Tomcat的默认配置在web.xml中设置了session的超时时间为30分钟(<session-timeout>30</session-timeout>)。在高QPS(每秒查询率)的压力下,如每秒5000次请求,这意味着每秒会产生5000个session对象。每个session对象是一个较大的Map结构,因此,随着时间推移,内存消耗会迅速增加,最终导致Heap Space的内存溢出。 针对这个问题,有两种主要的解决方法: 1. 在JSP页面的page指令中添加`session=false`。这将禁止该页面使用session,从而避免每次请求时创建新的session对象。例如: ```jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" session="false"%> ``` 2. 调整Tomcat的session配置,将session的超时时间设为0,使得session立即失效。这样,即使创建了session,它们也会很快被回收。在web.xml中修改配置如下: ```xml <session-config> <session-timeout>0</session-timeout> </session-config> ``` 通过上述调整,可以有效地减少因session对象积累而导致的内存消耗,从而防止内存溢出的发生。此外,为了更有效地管理Tomcat的内存,还可以考虑以下优化措施: - 调整Tomcat的启动参数,如增大Heap大小(-Xms和-Xmx),减少PermGen大小(-XX:MaxPermSize),或使用Java 8以上版本的MetaSpace代替PermGen。 - 监控和分析Tomcat的内存使用情况,使用工具如VisualVM或JConsole来识别内存泄漏的可能来源。 - 对于大规模应用,考虑使用负载均衡和集群部署,分散请求压力,避免单个服务器承受过高负载。 解决这个问题的关键在于理解JSP页面与session的关系,以及Tomcat如何处理session。通过适当配置和优化,可以有效防止因高并发请求引发的内存溢出问题。在日常开发和测试中,应重视性能监控和压力测试,以便及时发现和解决此类问题。
- 粉丝: 5
- 资源: 913
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
评论0