web应用中的Java内存管理

web应用中的Java内存管理,java,memory-management,out-of-memory,Java,Memory Management,Out Of Memory,我们有一个web应用程序,它从JSP执行查询,并将结果集以ArrayList的形式存储到集合中。它在应用程序中没有分页。当用户搜索更多记录时,加载页面所需的时间会更长。如果多个用户执行相同类型的搜索,则会出现内存不足错误。当我们检查检索数据的时间时,使用结果集形成收集对象所需的时间较短,对于50k条记录约为10秒。但要将数据呈现到页面中,需要花费大约5分钟的时间。有时会进入无反应阶段 这里我的问题是,何时释放用于存储结果集数据的收集对象来执行垃圾收集。是在页面完成数据的页面呈现之后吗?如果没有,

我们有一个web应用程序,它从JSP执行查询,并将结果集以ArrayList的形式存储到集合中。它在应用程序中没有分页。当用户搜索更多记录时,加载页面所需的时间会更长。如果多个用户执行相同类型的搜索,则会出现内存不足错误。当我们检查检索数据的时间时,使用结果集形成收集对象所需的时间较短,对于50k条记录约为10秒。但要将数据呈现到页面中,需要花费大约5分钟的时间。有时会进入无反应阶段

这里我的问题是,何时释放用于存储结果集数据的收集对象来执行垃圾收集。是在页面完成数据的页面呈现之后吗?如果没有,那么什么时候会被释放?

我的问题是,用于存储结果集数据的收集对象何时会被释放以执行垃圾收集。是在页面完成数据的页面读取之后吗?如果没有,那么什么时候才能被释放

一旦响应被提交,日期结构就开始符合GC的条件。作为从servlet提交响应的一部分,JSP迭代集合并将其呈现为HTML响应。当响应提交完成时,从适当的JSP呈现HTML,它可用于垃圾收集。当它被释放时,只有GC知道,但在响应提交的JSPas部分中呈现HTML后,它将变得合格


我假设来自SQL查询执行的结果集没有从其他任何地方被引用。如果被引用,则必须显式地将其设置为null,以告诉JVM它有资格进行垃圾收集

您不应该问自己它是否被垃圾收集,但是如果它符合垃圾收集的条件,因为您通常无法控制GC何时运行以及运行多少。也就是说,我建议您避免在内存中加载太多的信息,因为即使这些信息会及时被释放,也会造成大量的对象创建和破坏,特别是如果您没有显示检索到的所有数据。无论是添加分页,还是硬编码,都是一个上限,没有人会阅读成千上万的结果。我支持watery,并想补充一点,像ArrayList这样的结构表明了一些严重的设计问题。这不一定在所有情况下都是正确的。如果集合在JSP之外的某个地方被引用,或者被传递给任何其他可以引用集合实例的方法,那么它就不能被销毁?如果静态变量设置为null,则可以收集实例。@watery我假设来自SQL查询的集合不在其他任何地方使用。如果它在其他任何地方使用,则只有GC可以判断。现在检查我的编辑