【问题标题】:Caused by: java.lang.OutOfMemoryError: Java heap space引起:java.lang.OutOfMemoryError: Java heap space
【发布时间】:2012-08-03 04:18:11
【问题描述】:

我的目标:

我想为 1000 个用户运行我的应用程序。

现在

我正在尝试为 100 个用户运行。在应用程序运行期间,我想为每个用户执行一些过程,每个用户至少需要一小时,所以我为每个用户使用一个线程。

错误

Caused by: java.lang.OutOfMemoryError: Java heap space

我试图弄清楚这意味着什么,但我不确定如何解决它。

谁能帮帮我?

【问题讨论】:

  • 您使用的内存似乎比您拥有的多
  • 在我的情况下,我的 RAM 被 100% 使用,因为运行的应用程序太多。关闭几个应用程序后错误消失了。

标签: java multithreading operating-system threadpool


【解决方案1】:

这个错误意味着你的程序需要比你的 JVM 允许它使用的更多的内存!

因此,您几乎有两种选择:

  1. 使用-Xmx 选项增加程序允许使用的默认内存(例如,对于 1024 MB:-Xmx1024m
  2. 修改您的程序,使其需要更少的内存,使用更少的大数据结构并删除程序中某个时刻不再使用的对象

正如 Peter Lawrey 所指出的,使用分析器来查看您的程序在这种情况下正在做什么通常是一个好主意。

【讨论】:

    【解决方案2】:

    当出现内存不足错误时,我会检查 2 个区域

    1. 分配给 JVM 的内存是否足够,如果不使用 -Xmx 增加它
    2. 彻底检查代码,超过 90% 的时间我发现了错误,因为某些循环在某些边界条件下会递归。

    【讨论】:

      【解决方案3】:

      您可以在启动应用程序时尝试增加 JVM 堆空间。您可以尝试使用-Xmx2g 将其设置为 2GB。如果你运行的是 32 位 Java,我认为 2GB 已经够高了,但如果你有 64 位 JVM,你应该可以更高。

      编辑:

      示例:java -Xmx2g MyApp

      【讨论】:

        【解决方案4】:

        您也没有提供任何信息表明该问题与 StackOverflow 中给出的有关此错误的所有答案都非常不同;

        • 您使用的内存过多,您需要使用内存分析器来减少它。
        • 您将最大内存设置得太低,您需要使用-mx-Xmx 增加最大内存

        我怀疑由于您希望 1000 个用户运行每个需要一个小时的进程,您可能需要比您拥有的更多的资源。例如1000个核心?我建议您根据以可接受的水平运行用户所需的 CPU、内存、磁盘 IO 和网络 IO 来查看需要多少硬件,例如20 个用户和 50 个用户的倍数。

        【讨论】:

          【解决方案5】:

          使用具有有限工作线程数的producer/consumer pattern

          100 多个线程太荒谬了 - 难怪您的应用程序正在爆炸式增长。

          【讨论】:

          • 我同意你的观点,但我必须注意,100 多个线程并不是那么荒谬,事实上,如果你使用 Spring 和 Hibernate 检查正在运行的 Tomcat/jetty 中的线程,你可能已经大约有 50-60 个与框架相关的线程。想想看,在tomcat pool中默认配置的threadPool size是200,也就是说100+线程绝对不是那么可笑。话虽如此,具有工作线程的生产者/消费者模式确实是正确的解决方案,除了使每个进程需要不到 1 小时并且需要更少的堆或增加 maxHeapSize 本身。
          • @baba 抱歉,100 多个线程以 100% 的 CPU 运行每个至少 1 小时 荒谬且没有生产力。对于受 CPU 限制的处理,您需要的线程大致不超过 CPU。 J2EE 容器中的许多线程实际上都处于休眠状态,并且只保留在那里以保持状态,因此当它们(偶尔)醒来工作时,它们可以立即响应。
          • 是的,100 个线程同时运行超过 1-2 秒已经很疯狂了。我只是指出,如果大部分线程都在休眠,那么 100 多个线程是没有问题的,就像我在上面描述的框架中一样。
          猜你喜欢
          • 1970-01-01
          • 2016-04-15
          • 2013-05-18
          • 1970-01-01
          • 1970-01-01
          • 2018-12-25
          • 2014-06-15
          • 2013-02-25
          相关资源
          最近更新 更多