HttpSessionListener - GC 注意事项?
HttpSessionListener - GC considerations?
Tomcat 没有用于访问活动会话集合的 API,因此我想为我的 WebApp 设计一个 HttpSessionListener,但我对实现有一些顾虑。
如果我的监听器有一个成员变量列表,它存储对会话本身的引用并在 sessionDestroyed
上删除它们 - 这是否有内存泄漏的风险,就好像该列表与 [=18 不同步一样=] 对会话的内部跟踪,它们将无法被 GC 处理?
出于某种原因,这似乎是个坏主意,我想知道为什么 Tomcat 不允许访问它的内部列表?这将非常有用。任何见解将不胜感激。
我发现只要实现sessionCreated和sessionDestroyed就完全靠谱。唯一的缺点是您将失去活动会话 Tomcat 知道您的应用程序是否未 运行 或何时重新启动,但我从未见过它错过创建或销毁通知。
确保将会话数据存储在处理并发的对象中,例如 ConcurrentHashMap。
这是一个简单的例子:
public class SessionData implements HttpSessionListener {
private final static Map<String, HttpSession> activeSessions = new ConcurrentHashMap<>();
@Override
public void sessionCreated(HttpSessionEvent se) {
HttpSession session = se.getSession();
if (session != null) {
String id = session.getId();
System.out.println("HTTP session created. ID: " + id);
activeSessions.put(id, session);
}
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
HttpSession session = se.getSession();
if (session != null) {
String id = session.getId();
System.out.println("HTTP session destroyed. ID: " + id);
activeSessions.remove(id);
}
}
}
Tomcat 没有用于访问活动会话集合的 API,因此我想为我的 WebApp 设计一个 HttpSessionListener,但我对实现有一些顾虑。
如果我的监听器有一个成员变量列表,它存储对会话本身的引用并在 sessionDestroyed
上删除它们 - 这是否有内存泄漏的风险,就好像该列表与 [=18 不同步一样=] 对会话的内部跟踪,它们将无法被 GC 处理?
出于某种原因,这似乎是个坏主意,我想知道为什么 Tomcat 不允许访问它的内部列表?这将非常有用。任何见解将不胜感激。
我发现只要实现sessionCreated和sessionDestroyed就完全靠谱。唯一的缺点是您将失去活动会话 Tomcat 知道您的应用程序是否未 运行 或何时重新启动,但我从未见过它错过创建或销毁通知。
确保将会话数据存储在处理并发的对象中,例如 ConcurrentHashMap。
这是一个简单的例子:
public class SessionData implements HttpSessionListener {
private final static Map<String, HttpSession> activeSessions = new ConcurrentHashMap<>();
@Override
public void sessionCreated(HttpSessionEvent se) {
HttpSession session = se.getSession();
if (session != null) {
String id = session.getId();
System.out.println("HTTP session created. ID: " + id);
activeSessions.put(id, session);
}
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
HttpSession session = se.getSession();
if (session != null) {
String id = session.getId();
System.out.println("HTTP session destroyed. ID: " + id);
activeSessions.remove(id);
}
}
}