java调用系统。gc()导致JSP中的数据丢失
我目前正在调试一个web应用程序,它会导致间歇性问题,尤其是在命中率很高的情况下。由于每个新用户都有一个包含个性化导航菜单的会话,我想我会尝试看看会话变量需要多少内存
在JSP中处理会话对象创建的代码部分,我添加了以下代码:
System.gc();
long orgHeap = Runtime.getRuntime().freeMemory();
... create session variables ...
System.gc();
log.info("Heap delta: " + (Runtime.getRuntime().freeMemory() - orgHeap));
令我惊讶的是,添加系统。gc()会破坏应用程序。它不再工作,因为一些对象正在丢失(或者看起来是这样)。已初始化的值为空。当gc()调用被删除时,应用程序工作正常。gc()应该只删除标记为删除的对象-对吗
还有其他人有类似的问题吗
# 1 楼答案
垃圾收集永远不会移除活动对象,所以我认为你的问题在其他地方
当您声明这是在负载下时——“命中率很高”——这可能是一种错误使用EJB的情况,在这种情况下,您预计会发生一些事情,因为它是在低负载下进行的(比如在请求时重复获得同一个EJB),但在高负载下会发生变化(其他人得到了那个EJB,您得到了另一个)