我正在尝试编写一个填字游戏创作者。使用给定的字典txt文件和给定的模式txt文件。基本思想是使用DFS算法。当字典文件是v-e-r-y大(约50000字)时,问题就开始了。然后我回忆说:
线程“main”中的异常java.lang.OutOfMemoryError:超出GC开销限制
我知道我的程序中有一部分会浪费内存,但我不知道它在哪里,如何找到它以及如何解决它
答案 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内存中的绝对要求?
像我一样懒惰的家伙会将它存储在数据库中(甚至可能在内存中 - 例如高超音速),将搜索列表的责任转移到数据库,同时我的程序正在创建有趣的对称黑白方块组合:)只是一个想法。