我已经编写了一个代码并且我运行了很多但突然间我得到了OutOfMemoryError
:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at javax.media.j3d.BoundingBox.<init>(BoundingBox.java:86)
at javax.media.j3d.NodeRetained.<init>(NodeRetained.java:198)
at javax.media.j3d.LeafRetained.<init>(LeafRetained.java:40)
at javax.media.j3d.LightRetained.<init>(LightRetained.java:44)
at javax.media.j3d.DirectionalLightRetained.<init>(DirectionalLightRetained.java:50)
at javax.media.j3d.DirectionalLight.createRetained(DirectionalLight.java:116)
at javax.media.j3d.SceneGraphObject.<init>(SceneGraphObject.java:119)
at javax.media.j3d.Node.<init>(Node.java:178)
at javax.media.j3d.Leaf.<init>(Leaf.java:50)
at javax.media.j3d.Light.<init>(Light.java:270)
at javax.media.j3d.DirectionalLight.<init>(DirectionalLight.java:87)
答案 0 :(得分:58)
嗯,这是相当不言自明的:你已经没有记忆了。
您可能想尝试使用-Xmx标志启动它,例如
java -Xmx2048m [whatever you'd have written before]
这将使用最多2演出的内存。
有关详细信息,请参阅non-standard options list。
答案 1 :(得分:3)
你的记忆力不足。尝试将-Xmx256m
添加到java命令行。 256m
是给JVM的内存量(256兆字节)。它通常默认为64m
。
答案 2 :(得分:3)
我不知道javax.media.j3d,所以我可能会弄错,但你通常想调查是否存在内存泄漏。好吧,正如其他人所说,如果它是64MB并且你正在用3d做某事,也许它显然太小......
但如果我是你,我会设置一个分析器或visualvm,让你的应用程序运行更长的时间(几天,几周......)。然后查看堆分配历史记录和make sure it's not a memory leak。
如果您使用分析器,如JProfiler或NetBeans IDE等附带的分析器,您可以看到正在积累的对象,然后追踪正在发生的事情。好吧,几乎总是有些东西被错误地从一个集合...
答案 3 :(得分:3)
-Xmx1024m -XX:MaxPermSize = 512m -Xms512m
在服务器参数中添加此参数作为参数
答案 4 :(得分:2)
如果您使用APK工具重新编译已反汇编的APK
:
只需将内存分配设置得更大
将开关-Xmx1024m
设置为-Xmx2048m
java -Xmx2048m -jar signapk.jar -w testkey.x509.pem testkey.pk8 "%APKOUT%" "%SIGNED%"
你很高兴去......:)
答案 5 :(得分:0)
还有另一种最佳/有效的方法来解决此错误,
例如,让我们进行一个循环,计数到1万,这里您可能会收到错误Out of memory
,请解决该错误,可以让计算机有时间恢复。
因此,您可以400-500ms
睡觉,然后再循环计数下一个数字:
new Thread(new Runnable() {
public void run() {
try {
sleep(550); // 550 ms (milli seconds)
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
这样做,会使您的程序运行速度变慢,但是直到heap space
再次充满之前,您不会收到任何错误,因此,通过等待一些ms
,可以防止该错误。 / p>
除了循环之外,您还可以应用此方法。
希望它对您有帮助,:D