【问题标题】:java.lang.OutOfMemoryError: Java heap spacejava.lang.OutOfMemoryError:Java 堆空间
【发布时间】:2010-12-08 10:27:34
【问题描述】:

执行多线程程序时出现以下错误

java.lang.OutOfMemoryError: Java heap space

上述错误发生在其中一个线程中。

  1. 据我所知,堆空间仅由实例变量占用。如果这是正确的,那么为什么在运行一段时间后会出现此错误,因为在创建对象时分配了实例变量的空间。

  2. 有没有办法增加堆空间?

  3. 我应该对我的程序进行哪些更改以减少它占用的堆空间?

【问题讨论】:

标签: java multithreading out-of-memory heap-memory


【解决方案1】:

如果你想增加你的堆空间,你可以在命令行使用java -Xms<initial heap size> -Xmx<maximum heap size>。默认情况下,这些值基于 JRE 版本和系统配置。你可以找到more about the VM options on the Java website

但是,我建议您分析您的应用程序以找出您的堆大小被占用的原因。 NetBeans 包含一个very good profiler。我相信它在引擎盖下使用了jvisualvm。使用分析器,您可以尝试查找在何处创建了许多对象、对象何时被垃圾回收等等。

【讨论】:

  • 我正在使用 Netbeans,但我不知道如何使用分析器。我想了解有关分析器的更多信息,以便我可以使用它来查找我的应用程序中的内存泄漏。
  • 我在 NetBeans 网站 (profiler.netbeans.org) 上添加了一个页面链接,该网站有关于配置文件的非常好的文档,从最基本的到更高级的使用。
  • 默认值随 java 版本而变化,最好在你的答案中包含 this information
  • 刚刚修复了类似的问题并首次尝试:java -jar division.jar -Xmx512m -Xms512m - 这给了我同样的错误,但是当我这样做时: java -Xmx512m -Xms512m -jar division.jar - 一切都很好。所以参数的顺序也很重要。
  • @hipokito jar 文件后的参数作为 args[] 传递给 jar 文件的 main() 方法
【解决方案2】:

1.- 是的,但它几乎是指您的程序使用的整个内存。

2.- 是的,请参阅 Java VM 选项

-Xms<size>        set initial Java heap size
-Xmx<size>        set maximum Java heap size

java -Xmx2g 为您的应用分配最大 2 GB 的内存

但是你应该先看看有没有内存泄漏。

3.- 这取决于程序。尝试发现内存泄漏。这个问题将很难回答。最近你可以使用 JConsole 来分析你的记忆去哪里了

【讨论】:

    【解决方案3】:

    您可能希望查看此站点以了解有关 JVM 中内存的更多信息: http://developer.streamezzo.com/content/learn/articles/optimization-heap-memory-usage

    我发现使用visualgc 来观察内存模型的不同部分是如何填满的,以确定要更改的内容很有用。

    很难确定内存的哪一部分被填满,因此使用visualgc,因为您可能只想更改有问题的部分,而不仅仅是说,

    很好!我会给JVM 1G RAM。

    尝试更准确地了解您正在做什么,从长远来看,您可能会发现该程序更适合它。

    要确定内存泄漏可能在哪里,您可以使用单元测试,通过测试测试之前和之后的内存是什么,如果有太大的变化,那么您可能想要检查它,但是,您需要在测试仍在运行时进行检查。

    【讨论】:

      【解决方案4】:

      您可以通过以下程序获取您的堆内存大小。

      public class GetHeapSize {
          public static void main(String[] args) {
              long heapsize = Runtime.getRuntime().totalMemory();
              System.out.println("heapsize is :: " + heapsize);
          }
      } 
      

      那么您也可以使用以下方法增加堆大小: java -Xmx2g http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html

      【讨论】:

        【解决方案5】:

        要增加堆大小,您可以在启动 Java 时使用 -Xmx 参数;例如

        -Xmx256M
        

        【讨论】:

          【解决方案6】:
          1. 据我所知,堆空间仅由实例变量占用。如果这是正确的,那么为什么在运行一段时间后会出现此错误,因为在创建对象时为实例变量分配了空间。

          这意味着您在一段时间内不断地在应用程序中创建更多对象。新对象将存储在堆内存中,这就是堆内存增长的原因。

          堆不仅包含实例变量。它将存储所有非原始数据类型(对象)。这些对象的生命周期可能很短(方法块)或很长(直到在您的应用程序中引用该对象)

          1. 有没有办法增加堆空间?

          是的。看看这个 oracle article 了解更多详情。

          设置堆大小有两个参数:

          -Xms:,设置初始和最小堆大小

          -Xmx:,设置最大堆大小

          1. 我应该对我的程序进行哪些更改以减少它占用的堆空间?

          这取决于您的应用程序。

          1. 根据您的应用程序要求设置最大堆内存

          2. 不要在您的应用程序中造成内存泄漏

          3. 1234563 /p>

          来自oraclearticle的重要说明

          原因:详细信息Java heap space 表示无法在Java heap 中分配对象。此错误不一定意味着内存泄漏。

          可能的原因:

          1. 配置不当(没有分配足够的内存)
          2. 应用程序无意中持有对对象的引用,这会阻止对象被垃圾回收
          3. 过度使用终结器的应用程序。如果一个类有一个 finalize 方法,那么该类型的对象在垃圾回收时不会回收它们的空间。 如果终结器线程无法跟上终结队列,那么 Java 堆可能会填满,并且会抛出这种类型的 OutOfMemoryError 异常

          另一方面,使用更好的垃圾收集算法(CMSG1GC

          看看这个question了解G1GC

          【讨论】:

            【解决方案7】:
            1. 在大多数情况下,代码没有优化。释放那些你认为不再需要的对象。避免每次都在循环中创建对象。尝试使用缓存。我不知道你的应用程序是如何做的。但是在编程中,一条正常生活的规则也适用

              预防胜于治疗。 “不要创建不必要的对象”

            【讨论】:

              【解决方案8】:
              1. 局部变量位于堆栈上。堆空间被对象占用。

              2. 您可以使用-Xmx 选项。

              3. 基本上,每次使用new 分配新对象并在不再引用该对象后释放一段时间后,堆空间都会被用完。因此,请确保不要保留对不再需要的对象的引用。

              【讨论】:

                【解决方案9】:

                不,我认为您正在考虑堆栈空间。堆空间被对象占用。增加的方法是-Xmx256m,在命令行中把256替换成你需要的量。

                【讨论】:

                  【解决方案10】:

                  为避免该异常,如果您使用 JUnit 和 Spring,请尝试在每个测试类中添加:

                  @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
                  

                  【讨论】:

                    【解决方案11】:

                    在netbeans中,转到“运行”工具栏,-->“设置项目配置”-->“自定义”-->“运行”其弹出的窗口-->“虚拟机选项”-->填写'-Xms2048m -Xmx2048m'。它可以解决堆大小问题。

                    【讨论】:

                      【解决方案12】:

                      我已经尝试了所有解决方案,但上述解决方案均无效

                      解决方案:在我的情况下,我使用的是 4GB RAM,由于 RAM 使用率达到 98%,因此如果内存不可用,则需要的数量。也请查找此问题。如果出现此类问题,请升级 RAM,它会正常工作。

                      希望这能节省时间

                      【讨论】:

                      • 如果使用了 4 GB RAM,那么您现在有多少 RAM?增加 RAM 后,您是否遇到过内存错误的问题?
                      • 我增加了 8GB,现在 12Gb 工作正常。不增加内存后我不会面对java.lang.OutOfMemoryError: Java heap space 这个问题,现在它工作得很好
                      • 但老实说,只有当您的观众超过一百万时才需要 12 GB RAM。您的用户群如何?
                      • @KishanSolanki 实际上我在本地机器中遇到了这个错误。所以我浪费了太多时间来寻找解决方案。所以我已经发布了这个答案,以便它可以帮助遇到本地问题的人。如果您在本地遇到此问题,我认为我提到的解决方案将起作用。谢谢
                      • 我怀疑增加 RAM 是一种解决方案,因为您在本地运行应用程序而没有太多负载。您的应用程序中很有可能发生内存泄漏,或者您配置了一些导致 8GB 系统 RAM 下出现问题的 JVM 参数。
                      猜你喜欢
                      • 2015-05-14
                      • 2019-07-10
                      • 2019-12-12
                      • 2015-04-24
                      相关资源
                      最近更新 更多