OutOfMemoryError:超出GC开销限制

时间:2013-07-15 10:43:49

标签: java

在我们的一个java应用程序中,我们得到了 OutOfMemoryError:GC Overhead limit exceeded.

我们在某些地方使用HashMaps来存储一些数据。从日志中我可以确定它在同一个地方的复制。

我想问一下垃圾收集器是否会花更多时间清理哈希图?

在查看代码(我不能在这里分享)时,我发现有一个像

这样的Hashmap

Hashmap topo = new HashMap();

但从未使用过这个hashmap。 这是我的应用程序中的一种内存泄漏吗?

如果在一个正在进行某些处理的方法中创建了这个Hashmap并且在其他地方没有使用它,那么我的多个线程就会访问这个方法20。然后在这种情况下它会影响,创建如上所述的Hashmap ,垃圾收集器花费更多时间来恢复堆并抛出OOME。

如果您需要更多详细信息,请与我们联系。

3 个答案:

答案 0 :(得分:0)

  

n我们的一个java应用程序中有OutOfMemoryError:GC Overhead   超出限制。我们在某些地方使用了HashMaps来存储一些   data.From日志,我可以确定它的再现相同   的地方。

如果Hashmap只是构建并且很可能标记为静态,这意味着您不断向此hashmap添加内容并且永远不会删除。然后好一天它会导致OutOfMemoryError。

  

我想问一下垃圾收集者是否会花更多时间清理   哈希图?

垃圾收集器将时间花在未引用,弱引用,软引用的对象上。无论在哪里找到这样的物体,根据需要它都会清除它们。

  

看了代码(我不能在这里分享),我发现有一个Hashmap   像Hashmap一样创建topo = new HashMap(); ,但从未使用过这个hashmap。这是一个   我的应用程序中有哪种内存泄漏?

     

如果在正在执行某些操作的方法中创建此Hashmap   处理它并没有在其他地方使用也访问此方法   我的多线程说20。那么在这种情况下呢   影响,如上所述创建Hashmap,垃圾收集器花费更多时间   在恢复堆并扔掉OOME。

如果它是methid本地的hashmap,并且该方法在进行一些处理后退出,那么一旦方法退出就应该进行垃圾收集。由于hashmap是方法的本地,因此每个线程都有一个该映射的单独副本,一旦线程完成方法执行,map就符合GC的条件。

答案 1 :(得分:0)

你需要寻找长寿命的物体和结构,这可能是实际问题,而不是疯狂地掌握一些无能的经理对潜在问题的看法。

请参阅:

特别注意静态/应用程序生命周期的地图或列表,这些地图或列表在生命周期中添加,而不是仅在初始化时添加。很可能是其中一种或几种正在积累。

另请注意,内部类(Listeners,Observers)可以捕获对其包含范围的引用。防止这些无限期地被GC限制。

答案 2 :(得分:0)

  

如果您需要更多详细信息,请与我们联系。

需要更多详情。您需要对应用程序进行概要分析,以查看哪些对象占用了堆空间。

然后,如果应用程序实际上不再使用某些大小的对象,则会出现内存泄漏。查看对这些对象的引用,以找出它们在不再有用时仍保留在内存中的原因,然后修改代码以不再保留这些引用。

或者,您可能会发现内存中的所有对象都是您期望的工作集。然后,您需要增加堆大小,或重构您的应用程序以使用较小的工作集(例如,一次一个流事件而不是读取整个列表;将最后的视图细节存储在数据库而不是内存中;等等。 )。