【问题标题】:Exception in thread "main" java.lang.OutOfMemoryError: Java heap space线程“主”java.lang.OutOfMemoryError 中的异常:Java 堆空间
【发布时间】:2011-01-23 19:43:58
【问题描述】:

我写了一段代码,我运行了很多次,但突然我得到了一个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)

【问题讨论】:

标签: java out-of-memory


【解决方案1】:

嗯,这是不言自明的:你的内存已经用完了。

您可能想尝试使用更多内存启动它,使用 -Xmx 标志,例如

java -Xmx2048m [whatever you'd have written before]

这将使用最多 2 GB 的内存。

有关详细信息,请参阅non-standard options list

【讨论】:

  • 只是添加一堆堆?难道我们不想调查是否有内存泄漏??
  • @Zwei:先不说。只是将其更改为使用更多内存是尝试改善情况的一种极其简单的方法。如果它有效,那就太好了——如果无效,那么您在尝试中几乎没有任何损失。
  • @Jon:也许如果你做一个持续时间测试没关系。我担心它会长时间掩盖泄漏,让开发人员很难找到泄漏。但是见鬼,你可能比我了解百万倍;)
  • @Zwei:这取决于最终用户是谁。如果 Johanna 打算将程序交给其他人运行,那么找出它内存不足的原因确实是有意义的。如果她只打算自己使用它,那没关系 - 如果再过几个月没问题,然后她有问题,那么她可以解决它。
【解决方案2】:

如果您使用 APK 工具重新编译反汇编的 APK

只需将内存分配设置大一点

将开关-Xmx1024m设置为-Xmx2048m

java -Xmx2048m -jar signapk.jar -w testkey.x509.pem testkey.pk8 "%APKOUT%" "%SIGNED%"

你很高兴.. :)

【讨论】:

  • 他到底在哪里提到了APK
  • 可能不是,但我在谷歌上查找错误,谷歌将我定向到此链接。任何有此问题的人都会显示此页面,因为我正在重新编译 Android APK
【解决方案3】:

你的内存不足了。尝试将 -Xmx256m 添加到您的 java 命令行。 256m 是分配给 JVM 的内存量(256 兆字节)。它通常默认为64m

【讨论】:

    【解决方案4】:

    我不知道 javax.media.j3d,所以我可能会弄错,但您通常想调查是否存在内存泄漏。好吧,正如其他人所指出的,如果它是 64MB,而您正在使用 3d 做一些事情,那么它显然太小了......

    但如果我是你,我会设置一个分析器或visualvm,让你的应用程序运行更长的时间(几天、几周……)。然后查看堆分配历史记录和make sure it's not a memory leak

    如果您使用探查器,例如 JProfiler 或 NetBeans IDE 附带的探查器等,您可以看到正在累积的对象,然后跟踪正在发生的事情。嗯,几乎总是有些东西没有被错误地删除一个集合...

    【讨论】:

      【解决方案5】:

      -Xmx1024m -XX:MaxPermSize=512m -Xms512m

      将此参数作为参数添加到您的服务器参数中

      【讨论】:

        【解决方案6】:

        还有另一种最好/有效的方法来解决这个错误,

        例如,让我们进行一个计数到 10000 的循环,在这里您可能会收到错误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,你可以防止该错误。

        您可以应用此方法而不是循环。

        希望对你有所帮助,:D

        【讨论】:

          猜你喜欢
          • 2023-03-13
          • 1970-01-01
          • 2016-11-24
          • 2020-12-20
          • 1970-01-01
          • 1970-01-01
          • 2018-07-08
          • 1970-01-01
          相关资源
          最近更新 更多