有一个需求,要在内存里缓存当前用户信息,我们不被允许直接访问session,原有框架只暴露了一个App对象,我们想把用户信息挂靠该对象,我们需要确定:
1 该对象是否用户相关,还是用户无关;如果是用户无关,哪个用户进来,框架暴露同一个app对象,那么自然无法使用
2 用户下线后,该对象是否会回收,否则发生内存泄漏
使用 jmap -histo:live pid 强制gc后导出内存各类对象的文本信息,检查对象数量
(后来发现该类被guice代理增强,com.xxx.App$$EnhancerByGuice$$528a0e1a)
步骤:
0 初始状态,app为0
1 每次浏览器打开,是否app+1
打开chrome,app+1,打开ie,app再+1
证明了该对象用户相关,非单例
2 cookie+1,是否app+1
电脑只有2个浏览器,能够模拟的用户上限达到了,为模拟更多的用户与app对象,有此猜想
干掉chrome的cookie,刷新,app+1
3 浏览器关闭,app-1
模拟用户下线,查看app对象及用户信息能否被回收
显示app未-1
4 session清除,app-1
通过第3点,可以基本确认网站未用websocket监控用户上下线,那么就是session了
此前我们一共有3个用户,干掉2个session,显示app-2
至此,确认,我们可以将用户信息绑定在app对象上,而且用户下线session搁置一段时间后(一般30分钟),session自然过期,相应的app对象解除gcroot,在下一次gc中将被回收,绑在上面的用户信息一同回收。