最近一个系统运行一周左右开始响应变慢,初步判断可能是内存泄漏造成频繁GC造成。经过分析DUMP文件后发现内存中存在大量的SessionInMemory对象。每个线程中有上百个乃至上千个SessionInMemory对象存储在ThreadLocal中。
经过源代码的分析,基本可以断定该问题是shiro-redis造成的,以下是问题代码RedisSessionDAO.javaprivate Session getSessionFromThreadLocal(Serializable sessionId) {
Session s = null;
if (sessionsInThread.get() == null) {
return null;
}
Map sessionMap = (Map) sessionsInThread.get();
SessionInMemory sessionInMemory = sessionMap.get(sessionId);
if (sessionInMemory == null) {
return null;
}
Date now = new Date();
long duration = now.getTime() - sessionInMemory.getCreateTime().getTime();
if (duration
s = sessionInMemory.getSession();
logger.debug("read session from memory");
} else {
sessionMap.remove(sessionId);