【问题标题】:Java: Memory Restriction Hidden Somewhere?Java:内存限制隐藏在某处?
【发布时间】:2010-11-02 19:50:48
【问题描述】:

我有一个相当计算密集的 Java 基准程序,我正在 Linux 服务器上进行测试。它在我的 Macbook 上运行良好。

如果我在服务器上运行它,会发生以下情况:一旦内存占用达到大约 324 MB,程序就会开始停止运行。显然,一些限制禁止它使用更多内存,垃圾收集器必须做越来越多的工作才能保持在这个限制之下。在某些时候,会抛出“超出 GC 开销”异常。

我用-Xmx16000m 启动java,所以这不可能是内存限制。其他可能的限制是什么?

这些是我正在使用的 Java 版本:

Macbook:

java 版本“1.5.0_16”

Java(TM) 2 运行时环境,标准版(内部版本 1.5.0_16-b06-284)

Java HotSpot(TM) 客户端 VM(内部版本 1.5.0_16-133,混合模式,共享)

Linux 服务器:

java 版本“1.6.0_12”

Java(TM) SE 运行时环境(内部版本 1.6.0_12-b04)

Java HotSpot(TM) 64 位服务器 VM(内部版本 11.2-b01,混合模式)

【问题讨论】:

    标签: java


    【解决方案1】:

    如果在垃圾收集上花费了太多时间,并行收集器将抛出 OutOfMemoryError:如果超过 98% 的总时间用于垃圾收集并且回收的堆少于 2%,则会出现 OutOfMemoryError抛出。

    此功能旨在防止应用程序因堆太小而长时间运行而几乎没有进展。如有必要,可以通过在命令行中添加选项 -XX:-UseGCOverheadLimit 来禁用此功能。

    【讨论】:

      【解决方案2】:

      使用JConsoleJVisualVM 在运行时附加到您的JVM。使用这些工具,您可以监控 JVM 内不同内存池的内存使用情况。 JVisualVM 还允许您基于 CPU 或内存分析您的应用程序。这可能会让您更好地理解为什么您的应用程序没有按应有的方式运行。

      【讨论】:

        【解决方案3】:

        感谢您的提示。不过,我的问题似乎更具体。 Java 程序本身没有任何问题。我从 Mathematica 的 JLink 调用 Java。我现在意识到 324 MB 的限制必须来自那里(某处)。

        【讨论】:

        • 如何指定 -Xmx 选项? JLink 有点不直观;它有很多方法可以默默地忽略你关于 JVM 的指令......
        【解决方案4】:

        如果这是机器上可用的主内存。如果您的可用内存用完,无论您有多少可用虚拟内存,您的程序都会停止运行。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-05-05
          • 2010-12-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-02
          • 2017-11-15
          相关资源
          最近更新 更多