何时在java web mvc中取消引用对象

时间:2013-02-12 04:29:43

标签: java java-ee memory-management memory-leaks

我正在使用spring web mvc,最近遇到了java.lang.OutOfMemoryError:Java堆空间。

所以,我正在阅读它,我正在做的主要错误是我没有引用使用过的对象。所以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来获取转储文件。但我没有在项目文件夹中看到转储文件。在日志中我看到创建了转储文件。是否有人遇到过这种情况。

2 个答案:

答案 0 :(得分:1)

通常,此类问题的解决方案是:

  1. (明显)使用-Xmx增加最大堆设置,获得更大的硬件。这个appraoch可能不具备可扩展性,但可以为问题提供短期解决方案
  2. 问问自己,你真的需要一大块吗?如果不是尝试请求较小的块而不是节省堆使用。确保您没有超过您应该持有的对象的引用。一旦您知道不再需要您的变量,请将其设置为null,以便可以对其进行垃圾回收。

答案 1 :(得分:1)

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

我建议你首先增加堆内存,然后找出这些内容:

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

如果它具有全局范围,它是单个实例的一部分还是按请求实例创建的?结果数组中存储的对象是否在代码中的任何其他位置引用?

您可以使用Jhat获取对象引用图并找出其他人正在引用这些对象(免责声明:如果存储在数组中的对象包含对其他对象的引用并且通常就是这种情况,那将会变得混乱)< / p>

Better ways to identify objects not getting garbage collected?