Java OutOfMemoryError:超出GC开销限制

Java OutOfMemoryError:超出GC开销限制,java,Java,在我们的一个java应用程序中 OutOfMemoryError:超出GC开销限制。 我们在某些地方使用了HashMaps来存储一些数据。从日志中,我们可以确定它在同一个地方复制 我想问垃圾收集器是否花更多时间清理哈希映射 在查看代码(我不能在这里分享)时,我发现有一个Hashmap创建如下 Hashmap topo=newhashmap() 但是这个hashmap从未被使用过。 在我的应用程序中,这是一种内存泄漏吗 如果这个Hashmap是在一个正在进行某些处理的方法中创建的,并且没有在其他地

在我们的一个java应用程序中
OutOfMemoryError:超出GC开销限制。

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

我想问垃圾收集器是否花更多时间清理哈希映射

在查看代码(我不能在这里分享)时,我发现有一个Hashmap创建如下

Hashmap topo=newhashmap()

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

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

如果你需要更多的细节,请告诉我

在我们的一个java应用程序中,我们得到了OutOfMemoryError:GC开销 超出限制。我们在某些地方使用HashMaps来存储一些数据 数据。从日志中我们可以看出它同时在复制 地点

如果Hashmap只是一直在构建,并且很可能被标记为静态的,这意味着您一直在向该Hashmap添加内容,而从不删除。然后,在晴朗的一天,它将导致OutofMemory错误

我想问垃圾收集器是否花更多时间清理垃圾 散列图

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

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

如果此Hashmap是在正在执行某些操作的方法内创建的 处理,且不在其他地方使用。也可访问此方法 我的多个线程是20。那么在这种情况下,它会不会 影响,如上所述创建Hashmap,垃圾收集器需要花费更多的时间 在恢复堆和扔OOME


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

您需要寻找长寿命对象和结构,这可能是实际的问题,而不是疯狂地抓住某个毫无头绪的管理者关于潜在问题的想法

见:

请特别注意静态/或应用程序生命周期映射或列表,它们是在生命周期中添加的,而不仅仅是在初始化时添加的。很可能是其中一个或几个正在积累

还要注意的是,内部类(监听器、观察者)可以捕获对其包含范围的引用&防止这些引用被无限期地GC’ed

如果你需要更多的细节,请告诉我

你需要更多的细节。您需要分析应用程序以查看哪些对象正在占用堆空间

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


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

如果
topo
引用未超出其声明的范围,则为否,它不会导致内存泄漏。垃圾收集器在清除这些哈希映射时会遇到问题吗?如果有大量的哈希映射,请使用探查器查看内存消耗或增加最大内存大小。如果你不测量你的程序,你只是在猜测。使用大量的hashmap对性能/内存没有好处,但这可能不是最大的问题。我认为您需要查看堆的内容,以便查看泄漏发生的位置。在大型系统中,通常很难通过读取代码来发现漏洞。内存分析工具至少会为您指明正确的方向。@DaveHowes我在OOME上收集了heapDump,发现我们在ThreadpoolExecutor中使用的LinkedBlockingQueue占用了分配给进程的堆总数的93%。分配的堆总数为-xmx350m。发生这种情况是因为任务的生成量很大吗比池中执行它的线程还要快?这个java bug会对此负责吗:bugs.sun.com/view_bug.do?bug_id=6806875。如何处理这种情况??谢谢……假设有大量这样未使用的哈希图,垃圾收集器是否会花费一些时间来恢复堆,是否有可能抛出OOME。@Saurav对空哈希映射的简单引用几乎不会占用大量堆空间。简单的回答是,您正在其他地方泄漏。您将在应用程序的生命周期内保存或积累实际数据。。一个临时HashMap,方法本地,不在外部引用,这不是问题。我在OOME上收集了heapDump,发现我们在ThreadpoolExecutor中使用的LinkedBlockingQueue占用了分配给进程的堆总数的93%。分配的堆总数为-xmx350m。发生这种情况是因为任务的生成速度比进程快得多吗