线程“main”中的异常java.lang.OutOfMemoryError,如何查找和修复?

时间:2010-06-06 17:40:23

标签: java out-of-memory

我正在尝试编写一个填字游戏创作者。使用给定的字典txt文件和给定的模式txt文件。基本思想是使用DFS算法。当字典文件是v-e-r-y大(约50000字)时,问题就开始了。然后我回忆说:

线程“main”中的异常java.lang.OutOfMemoryError:超出GC开销限制

我知道我的程序中有一部分会浪费内存,但我不知道它在哪里,如何找到它以及如何解决它

5 个答案:

答案 0 :(得分:3)

真的浪费记忆吗?如果您正在加载一个相当大的字典,那么您可能只想增加JVM内存设置(JVM具有最大内存分配 - 取决于您的平台,并且可配置)。

e.g。

$ java -Xmx512m ....

会将JVM的最大内存分配增加到512m。

如果您认为存在内存泄漏(由于引用未被释放而导致垃圾收集无法进入),则可能会使用YourKit之类的分析器。请注意,这不是免费的,但试用版可能会帮助您解决问题。

答案 1 :(得分:2)

要解决此问题(在基于linux的操作系统中),请执行以下操作

1)增加内存(以便不会经常出现此问题)通过在

中配置“domain.xml”

/的glassfish /域/域1 /配置

搜索

<jvm-options>-XX:MaxPermSize=

set it to higher value eg- 198m or 256m

2)杀死glassfish进程以释放它运行的端口(在我的情况下是8686 )  打开终端(在基于linux的操作系统中)并输入 -

sudo netstat -npl | grep 8686

这将导致类似......

tcp6 0 0 :::8686 :::* LISTEN 3452/java

下次使用

kill -9 3452杀死这个过程(在这种情况下为3452)

现在尝试启动glassfish,它应该开始。

答案 2 :(得分:0)

有些时候,我看到人们在循环中初始化变量,如

While(condition){

    String s="tttt";

}

这应该避免,因为它浪费了大量的内存。

答案 3 :(得分:0)

这是一个棘手的问题。我遇到过一两次,增加堆大小没有用。使用VM设置解决它 - 您甚至可能希望减小堆大小(它曾经为我工作)。您可能还想测试不同的垃圾收集器,我使用G1 collector成功了。

关于如何避免这种错误的一般建议也很难(或者在我研究这个问题以解决我自己的问题时似乎是这样)。 High infant mortality可能很好,因为年轻物品比旧物品便宜。

答案 4 :(得分:0)

大字典... mmm ..是否存在直接存储在jvm内存中的绝对要求?

像我一样懒惰的家伙会将它存储在数据库中(甚至可能在内存中 - 例如高超音速),将搜索列表的责任转移到数据库,同时我的程序正在创建有趣的对称黑白方块组合:)

只是一个想法。