【问题标题】:Java Memory Management in web applicationWeb 应用程序中的 Java 内存管理
【发布时间】: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


【解决方案1】:

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

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

我假设您的来自执行 SQL 查询的 ResultSet 没有被其他任何地方引用。如果是这样,您必须明确将其设置为 null 以告诉 JVM 它有资格进行垃圾收集

【讨论】:

  • 不一定在所有情况下都是如此。如果集合在 JSP 之外的某个地方被引用,或者传递给任何其他可以引用集合实例的方法,则它不能被销毁。
  • 为什么不呢?如果静态变量设置为null,则可以收集实例。
  • @watery 我假设来自 SQL 查询的集合没有在其他任何地方使用。如果在其他任何地方使用,只有 GC 可以判断。现在检查我的编辑
猜你喜欢
  • 2012-10-15
  • 2017-11-19
  • 2023-03-12
  • 1970-01-01
  • 2012-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多