概要

Session活化:从硬盘上读取序列化的session到内存中
Session钝化:把内存中的session序列化到硬盘上

Tomcat中两种Session钝化管理器

session钝化机制是由sessionManager管理
tomcat提供了以下这两种session处理方式

org.apache.catalina.session.StandarManager
org.apache.catalina.session.Persistentmanager

StandarManager是tomcat的session默认处理方式,如果配置Persistentmanager则使用Persistentmanager,没有配置则使用StandarManager。

1. StandarManager

当Tomcat服务器关闭或者重启时tomcat服务器会将当前内存中的session对象钝化到服务器文件系统中;
另一种情况是web应用程序被重新加载时(其实原理也是重启tomcat),内存中的session对象也会被钝化到服务器的文件系统中
当系统启动时,会把序列化到硬盘上session重新加载到内存中来。这样用户还保持这登录状态,提供系统的可用性。

  1. 只有在tomcat关闭和启动的时候才会活化和钝化session
  2. 强制kill掉tomcat是不会把session钝化到硬盘上的。

2. Persistentmanager

可以将内存中长时间不用的session钝化到硬盘上,减少内存的占用。

比如:当网站有大量用户访问的时候,服务器会创建大量的session,会占用大量的服务器内存资源,当用户开着浏览器一分钟不操作页面的话建议将session钝化,将session生成文件放在tomcat工作目录下。

那怎么该设置呢?

在 /WebRoot/META-INF 目录下创建 context.xml文件(也可以在tomca目录下的其他四个地方创建,在这里建是为了只对这个网站起作用),配置如下:

<?xml version="1.0" ?>
<Context>  <Manager className="org.apache.catalina.session.PersistentManager"  maxIdleSwap="1">  <Store className="org.apache.catalina.session.FileStore"  directory="sessionDir" />  </Manager>
</Context>  

StandarManager 源码分析

Session活化 doLoad() 方法

在当前程序重新启动的时候,调用doLoad() 方法进行活化session

1. 清空sessions中的session(刚启动,sessions中应该是没有session的)

protected Map<String, Session> sessions = new ConcurrentHashMap<>();
  1. 判断是否有钝化的session文件。如果没有则结束加载session,如果有文件,则进行下面的加载session


1. 获取当前项目的WebappClassLoader
2. 从硬盘中读取session,并把session反序列化成StandardSession对象。然后激活当前的session,并判断当前session是否过期

activate() 方法


这个方法迭代执行了所有在web.xml中注册的session活化的listener监听器。

expire() 方法


expire方法是判断session是否过期,如果过期则执行所有在web.xml中注册过所有的HttpSessionListener的sessionDestroyed()方法

Session钝化 unLoad() 方法

在当前程序关闭的时候,调用unLoad() 方法进行钝化session


1. 获取输出文件流
2. 遍历内存中所有的session,并把session序列化到硬盘文件中。
3. 把序列化过的session置为不可用,并重置session中的所有属性。

PersistentManager 源码分析

1. session 钝化

通过 ContainerBase.startInternal() -> threadStart() 开启一个线程,定时的轮询所有的session,把长时间不使用(或者超出最大数量等)的session钝化到硬盘上。

threadStart()


每隔backgroupProcessorDelay时间轮询处理session。

processPersistenceChecks()

PersistentManagerBase.processExpires() -> processPersistenceChecks()

Tomcat只是在下面三种情况会将Session通过Store保存起来:
1. 当Session的空闲时间超过minIdleSwap和maxIdleSwap时,会将Session换出
2. 当Session的空闲时间超过maxIdleBackup时,会将Session备份出去
3. 当Session总数大于maxActiveSession时,会将超出部分的空闲Session换出

下面只分析下第一种情况的源码processMaxIdleSwaps() 方法

processMaxIdleSwaps()


1. 判断Session的空闲时间超过minIdleSwap和maxIdleSwap值。
2. 如果超过则通过 swapOut() 方法把session钝化到硬盘上。

swapOut() 方法


1. 通过passivate() 方法调用web.xml 中注册的HttpSessionActivationListener事件(同StandardSession)
2. 调用writeSession() 方法把session钝化到指定的地方
3. 从sessions 中把session移除
4. 重置session,等待垃圾收集器回收此session。

writeSession()


调用store把session存储到指定的地方,如下面的配置,是把session钝化到硬盘文件中。

<Store className="org.apache.catalina.session.FileStore"  directory="sessionDir" />  

2. session 活化


1. 当请求中获取session时,先从调用findSession() 从内存sessions 中查找。
2. 如果内存中找不到 则调用 swapIn() 方法,进行查找,判断该session是否钝化了,如果钝化则把该session活化加载到内存。

swapIn() 方法


为当前查找的session设置一个lock。


1. 双重检查,在锁中再次判断sessions中是否有此session。
2. 从store中加载session。
3. 如果store 有此session 并判断该session是否过期,并做处理


1. 通过tellNew() 调用 web.xml 中注册HttpSessionListener的事件
2. 把session添加到sessions 集合中。
3. 通过activate()方法调用web.xml中注册的HttpSessionActivationListener事件
4. 最后把该session相关的锁,删除。

本人简书blog地址:http://www.jianshu.com/u/1f0067e24ff8    
点击这里快速进入简书

GIT地址:http://git.oschina.net/brucekankan/
点击这里快速进入GIT

Tomcat 之 Session的活化和钝化 源码分析相关推荐

  1. pbp 读取 mysql数据_SqlAlchemy 中操作数据库时session和scoped_session的区别(源码分析)...

    原生session: from sqlalchemy.orm import sessionmaker from sqlalchemy import create_engine from sqlalch ...

  2. MyBatis原理分析之四:一次SQL查询的源码分析

    上回我们讲到Mybatis加载相关的配置文件进行初始化,这回我们讲一下一次SQL查询怎么进行的. 准备工作 Mybatis完成一次SQL查询需要使用的代码如下: Java代码   String res ...

  3. 原理分析之四:一次SQL查询的源码分析

    上回我们讲到Mybatis加载相关的配置文件进行初始化,这回我们讲一下一次SQL查询怎么进行的. 准备工作 Mybatis完成一次SQL查询需要使用的代码如下: Java代码   String res ...

  4. 【四】Spring源码分析之启动主流程---AbstractApplicationContext的refresh方法

    入口: 在SpringBoot启动的时候,SpringApplication的run方法中 refreshContext(context); 里面最终调用的是AbstractApplicationCo ...

  5. IDEA之Session的活化和钝化

    Session活化和钝化的服务器调优,性能优化方案 ,网上已经很多了,这里我就强调一下 应用场景,总之这个很重要. 应用场景: 1.一般来说,服务器启动后,就不会再关闭了,但是如果逼不得已需要重启,而 ...

  6. Tomcat源码分析(九)--Session管理

    本系列转载自 http://blog.csdn.net/haitao111313/article/category/1179996 在明白Tomcat的Session机制之前,先要了解Session, ...

  7. Tomcat7.0源码分析——Session管理分析(下)

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/beliefer/article/details/52451061 前言 在<Tomcat7.0 ...

  8. Tomcat7.0源码分析——Session管理分析(上)

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/beliefer/article/details/52450268 前言 对于广大java开发者而言, ...

  9. Tomcat 处理 HTTP 请求源码分析(上)【转】

    原文地址:https://www.infoq.cn/article/zh-tomcat-http-request-1 很多开源应用服务器都是集成 tomcat 作为 web container 的,而 ...

最新文章

  1. Myeclipse快捷键的使用
  2. libevent中的hash表
  3. 首发福利!全球第一开源ERP Odoo系统架构部署指南 电子书分享
  4. ASP.NET GridView嵌套DataList实例
  5. golang实现聊天室(四)
  6. Python 水仙花数
  7. javascript跨域
  8. 怎么注册免费苹果开发者账号?
  9. ireport分组打印
  10. android CircleIndicator 实现引导页
  11. 识别速度3.6ms/帧,人像抠图、工业质检、遥感识别,用这一个分割模型就够了
  12. 三星支付存在漏洞可导致黑客进行交易劫持
  13. 影刀学习抓取网页详情
  14. 对于Jenkins和gitlab连接的注意事项
  15. 国内外创业环境的比较
  16. 双11越来越“高大上”,你的工资还配得上它吗?
  17. 炮弹仿真系统matlab软件下载,基于Matlab/Simulink的导弹六自由度弹道仿真系统设计...
  18. Http协议之CONNECT方法
  19. H5中的明星互动,变为另一种品牌推广营销方式
  20. Vue前端工程目录结构

热门文章

  1. 期末复习、化学反应工程科目(第六、七章)
  2. 四十四、Mysql的命令和PyMysql
  3. html不读取缓存,如何让前端浏览器不进行缓存
  4. 三面百度AI岗,炸了
  5. 辰星计划2021 | 旷视春季实习生招募—空中宣讲会第二弹来了!
  6. 发布可伸缩超网SCARLET,小米AutoML团队NAS三部曲杀青
  7. NIPS 2017论文解读 | 基于对比学习的Image Captioning
  8. android ge模拟器,在Android模拟器上的一些小陷阱
  9. input输入框自动消除空格
  10. 用ram实现寄存器堆_Verilog如何实现低功耗设计?