线程“main”中的异常java.lang.OutOfMemoryError:Java堆空间

时间:2010-03-04 18:45:05

标签: java out-of-memory

我已经编写了一个代码并且我运行了很多但突然间我得到了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)

6 个答案:

答案 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)

enter image description here -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