开发中一个未经优化的使用tomcat提供服务的web应用在某日突然内存溢出,而该服务的缓存信息很少,于是google + code insight了一把,加以总结如下。
新用户访问tomcat下的web应用,tomcat会默认为用户创建session,即一个StandardSession实例,
protected StandardSession getNewSession() {
return new StandardSession(this);
}
StandardSession中有数十的变量,其中包括id(用于标记session),及ArrayList、ConcurrentHashMap、Hashtable三个集合类各一。
id:tomcat是基于id来识别用户,这个sessionId在server和client(即browser)间通过ssl、cookie、url改写三种方式一直来交互id,从而保持用户信息及context。
attributes:ConcurrentHashMap,用于保存用户的各种属性设置,应用中常见的session.setAttribute()设置的各种属性即保存于此。
listeners:ArrayList,session事件监听器列表,用于sessin相关事件发生时调用。
notes:Hashtable,用于保存catalina组件及事件监听器的与session关联的一些对象,在分布式session时不序列化。
从中实际也可以看出,对于一个普通的请求,server实际是要有一定得内存开销的,尤其对于三个集合量。
对于一般有状态的web应用,这些开销当然是必须的,是b/s非常重要的交互基础,但对于一些提供无状态的data service、redirecte service等,这些确实一个要十分警惕的开销。
对于无状态的data service和跳转服务器,每次请求都是独立的,or每次请求的交互中不带任何形式的id(即前面三种方式),而默认情况下tomcat为每次请求创建一个新的sessin,每个session的过期时间默认是半小时,所以当请求量大于一定值时,tomcat的内存会急剧上升,导致内存溢出。
总结:
1 对于stateless的data service、redirect service等无需context的服务,直接设置session为false,
2 对于分布式服务,对于负载均衡、单点故障、热升级等,可以使tomcat提供等同服务,通过session复制加以解决。如一个tomcat宕机,但用户的session任然在其他服务器上保存,这样用户可以无影响的继续操作,或者服务器可以进行热升级,单台逐渐重启升级,对用户透明。
分享到:
相关推荐
【标题】:“Tomcat-Redis-Session管理”的实践指南 在Web应用开发中,Session管理是关键的一环,用于在用户浏览器与服务器之间保持状态。传统的Session存储方式是将数据存放在服务器内存中,但随着高并发访问和...
在IT行业中,尤其是在Java Web应用领域,Tomcat服务器的session管理是至关重要的。"tomcat-session同步所需jar.rar_session集群共享_tomcat session"这个标题表明我们关注的是如何在Tomcat集群环境中实现session的...
综上所述,"tomcat-redis-session-manager包集合"为使用Tomcat8和JDK1.8的开发者提供了便捷的手段,通过集成Redis来增强session管理,提升应用在分布式环境下的性能和可靠性。正确配置和使用这个工具可以显著改善...
在压缩包的文件名“tomcat-memcached”中,我们可以推断这个资源是关于Tomcat集成memcached进行Session管理的。Memcached是一个轻量级的内存存储系统,能够快速地存储和检索数据,特别适合用来存储像Session这样的...
根据压缩包子文件的文件名称"tomcat-redis-session-manage-tomcat7",可以推断出这是一个针对Tomcat7的Redis session管理模块。这个模块可能包含以下组件: 1. **Redis连接器**:负责建立和管理Tomcat与Redis服务器...
【深入浅析TomCat Session管理分析】 Session在Java Web开发中扮演着至关重要的角色,它允许服务器跟踪用户的交互,存储用户的状态信息。Tomcat作为广泛使用的开源Servlet容器,其内部的Session管理机制对于理解Web...
在Web开发中,Session管理是确保用户状态跟踪的重要机制之一。Tomcat作为一款广泛使用的Java应用服务器及Servlet容器,提供了多种方式来设定Session的有效时长。这有助于开发者根据具体业务需求灵活调整Session的...
**memcached-session-manager** 是一个开源项目,它实现了基于 Memcached 的 Tomcat Session 管理器。Memcached 是一个高性能、分布式的内存对象缓存系统,常用于减轻数据库的负载。将 Session 存储在 Memcached 中...
- `tomcat-catalina-7.0.61.jar` 和 `tomcat-servlet-api-7.0.61.jar`:这两个是Tomcat的核心组件,提供了Servlet容器的基本功能,包括Session管理接口。 - `jedis-2.7.2.jar`:这是Java对Redis的客户端库,提供了...
"tomcat-redis-session-manager-master" 是一个项目名称,表明这是一个与Tomcat(一个流行的Java应用服务器)和Redis(一个开源的内存数据结构存储系统)相关的session管理器的主分支。通常,这样的项目是用来实现将...
在处理用户会话时,Tomcat默认使用基于内存的session管理,但这可能导致在高并发场景下session数据丢失或者性能瓶颈。为了解决这些问题,可以将Tomcat的session存储机制改为Memcache,这是一种高效、分布式的内存...
上文中在Tomcat的context.xml中配置了Session管理器RedisSessionManager,实现了通过redis来存储session的功能;Tomcat本身提供了多种Session管理器,如下类图: 1.Manager接口类 定义了用来管理session的基本...
SpringSession 是一个强大的框架,它扩展了 Spring Framework 的 Session 支持,允许开发者在分布式环境中管理用户会话。尤其在处理多台 Tomcat 服务器时,SpringSession 提供了一种优雅的方式来实现 session 共享,...
标题中的“tomcat8专用session管理包.rar”指的是一个针对Tomcat 8的特定session管理解决方案,这个压缩包包含了在使用Nginx作为反向代理服务器,并与Redis结合实现负载均衡场景下,确保Tomcat应用间session数据共享...
综上所述,`redis-tomcat-session-manager`是一个优化Tomcat Session管理的实践,通过集成Redis来提供更高效、可扩展的会话存储解决方案。配置过程中,需注意JAR包的添加、配置文件的替换以及正确设置Redis连接参数...
**Tomcat Session管理** 在Tomcat中,Session是用来存储用户会话状态的,包括用户的登录信息、购物车等。默认情况下,Session信息存储在服务器的内存中,如果服务器集群或者重启,这些信息将丢失。为了实现Session的...
综上所述,"Tomcat Redis Session"是一种在分布式环境中保证用户会话一致性的解决方案,通过集成Redis和Nginx,有效地解决了Web应用集群中的Session管理难题。在实际部署中,还需要考虑系统整体架构、性能优化和运维...
Tomcat_Session 的持久...Tomcat 提供了 StandardManager 和 PersistentManager 两个实现类来管理 Session,其中 PersistentManager 能够把 Session 对象保存到 Session Store 中,提供了更为灵活的 Session 管理功能。
Tomcat作为最常用的Java Servlet容器,其Session管理能力直接影响到应用的性能和可扩展性。本教程将详细介绍如何利用Tomcat 8或9以及Redis实现Session共享,支持Redis集群,以提高系统的可伸缩性和数据一致性。 ...