0

我正在研究spring web mvc,最近遇到了java.lang.OutOfMemoryError: Java heap space。

所以,我正在阅读它,而我正在做的主要错误是我没有尊重使用过的对象。所以 GC 并没有清理大量内存。

现在的问题是何时取消引用它。

这是基本的输出流程:

From front end user sends a request

server calls a library with the users request

library returns it a big chunk of array of results.

server forwards it to front end. 

现在直到这一点我无法取消引用结果数组,因为我需要结果对象。我对么 ?因此,当用户发送新请求时,我应该清理结果数组并使用新请求调用库。

我还使用 -XX:+HeapDumpOnOutOfMemoryError 来获取转储文件。但我没有在项目文件夹中看到转储文件。在日志中,我看到创建了转储文件。有没有人遇到过这种情况。

4

2 回答 2

1

如果没有http://sscce.org/,将很难为您提供帮助。JVM 为您执行 GC,如果您的对象具有明确定义的范围,则它们应该自动进行 GC。

我建议您从增加堆内存开始弄清楚这些:

结果数组的范围是什么(全局或仅限于方法调用层次结构,即通过方法调用堆栈传递到前端)?

如果它具有全局范围,它是单例实例的一部分还是每个请求实例创建的?Result 数组中存储了哪些对象,它们是否在代码中的其他任何地方引用?

您可以使用 Jhat 来获取对象引用图并找出还有谁在引用这些对象(免责声明:如果存储在数组中的对象包含对其他对象的引用,这将变得一团糟,这通常是这种情况)

识别未收集垃圾的对象的更好方法?

于 2013-02-12T05:59:44.883 回答
1

一般这类问题的解决方法是:

  1. (明显)使用 增加最大堆设置-Xmx,获得更大的硬件。这种方法可能不可扩展,但可以为问题提供短期解决方案
  2. 问问自己,你真的需要一大块吗?如果不尝试请求更小的块来节省堆使用。确保您对对象的引用没有超过您应该持有的时间。一旦您知道不再需要您的变量,请将其设置为 null 以便它们可以被垃圾收集。
于 2013-02-12T05:29:51.680 回答