【发布时间】:2014-08-26 14:47:11
【问题描述】:
我们有一个网络应用程序,它正在执行来自 JSP 的查询并将结果集以 ArrayList<TreeMap<ColumnName, Value(String)>> 的形式存储到集合中。它在应用程序中没有分页。当用户搜索更多记录时,加载页面需要更多时间。如果多个用户执行相同类型的搜索,我们会出现内存不足错误。当我们检查检索数据的时间时,使用结果集形成集合对象需要更少的时间,对于 50k 条记录大约需要 10 秒。但是为了将数据渲染到页面中,大约需要 5 分钟。有时会进入无响应阶段。
这里我的问题是,当用于存储结果集数据的收集对象将被释放以进行垃圾收集时。是在页面完成数据的页面渲染之后?如果没有,那么什么时候可以释放?
【问题讨论】:
-
你不应该问自己它是否被垃圾收集,而是它是否有资格进行垃圾收集(因为你通常无法控制 GC 何时运行和多少钱)。也就是说,我建议您避免在内存中加载如此多的信息,因为即使它会及时释放,也会产生大量的对象创建和销毁,特别是如果您不提供检索到的所有数据。要么添加分页,硬编码上限,没有人会阅读一万个结果。
-
我第二个水汪汪的,想补充一点,像
ArrayList<TreeMap<ColumnName, Value(String)>>这样的结构表明存在一些严重的设计问题。
标签: java memory-management out-of-memory