java - 如何处理java.lang.OutOfMemoryError : GC overhead limit exceeded gracefully?

标签 java mysql jsf garbage-collection glassfish

我用 Java/JSF 为客户端编写了一个非常简单的报告,它基本上根据一些简单的搜索条件(开始和结束日期等)从 mysql 数据库中的表中返回行。该数据库包含大量行,但过去有一个限制,即只能返回某种类型的行,而这些行仅占表的 1% 左右。

最近,客户要求我在搜索条件中添加一个复选框,以便他们绕过返回行的限制。如果您选中该框并保留较宽的日期范围,则可以尝试检索大量结果集,之后用户将被重定向到 Glassfish 错误页面,并显示令人愉快的消息:java.lang.OutOfMemoryError:GC 开销限制。 p>

我发现的有关此错误的帖子的每个回复基本上都说“不要捕获内存不足错误”,我明白为什么:你无法真正预测 OOM 错误会在哪里出现,即使你知道它是在哪里引起的。

我想知道如何比 Glassfish 错误页面更优雅地处理这个问题。理想情况下,我希望能够将用户带回到搜索页面,并显示一条消息,告诉他们如果条件太宽泛,则缩小条件。在内存耗尽之前有什么好方法可以做到这一点吗?或者是对搜索结果进行任意限制的最佳解决方案(也许首先使用 count() 运行查询,如果返回超过 X,则返回搜索页面并显示错误消息?)

最佳答案

我认为最好的方法是使用分页。用户真正可以在屏幕上看到多少记录?假设为 100。因此,您将显示前 100 行,并导航至包含接下来 100 行的下一页。但是,当然,这取决于业务需求。

关于java - 如何处理java.lang.OutOfMemoryError : GC overhead limit exceeded gracefully?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33576674/

相关文章:

java - 如何在 Windows 上通过 Java 启动 MySQL 并在启动时返回?

java - 泛型可以作为复合组件属性标签的 "type"吗?

javascript - 当同一 View 中有两个图表时,如何独立显示或隐藏 Primefaces 图表图例?

java - 从未使用过的值/缺少返回语句

java - 为什么我的对象在此类中被垃圾收集

java - 从另一台机器通过java连接MySQL数据库

jsf - Primefaces 数据表的列标题中的工具提示

java - 什么时候使用常量?

java - IOException 在访问 Citrix 安装的驱动器时磁盘空间不足

mysql - 如何使用 MySQL 在查询中创建条件