【问题标题】:Creating "could not reserve enough space for object heap" error创建“无法为对象堆保留足够的空间”错误
【发布时间】:2010-05-04 15:14:49
【问题描述】:

是否有使用内存的实用程序(适用于 Windows),因此我可以创建 JVM“无法为对象堆保留足够的空间”错误?

我想在 JVM 之外的进程中用完这些内存。

【问题讨论】:

  • 这里的真正目标是什么?让 JVM 因为 box 内存耗尽而无法启动?还是您只是在寻找打印信息的技巧?

标签: java jvm memory-management


【解决方案1】:

只需使用 -Xms 标志

java -Xms3g org.foo.Main

上面将尝试创建 3 GB 的初始堆大小,只需调整该数字使其大于系统的总内存(物理和虚拟)

【讨论】:

  • 这实际上不会像你在 32 位 Windows 机器上解释的那样工作,或者至少在我认为你的意思的意义上。 JVM 需要一个连续的堆地址范围,而 Windows 在 2gb 处有一个漏洞。所以是的,它失败了,但不一定是盒子内存不足,而是因为它不适合单个地址空间。
【解决方案2】:

我觉得你可以试试这个:

String s = "b";
for (int i = 0; i < 1000 000; i++) {
  s+="b";
}

因为每次运行 s+="b" 行时都会分配新字符串,所以它应该用完 java 堆。

【讨论】:

  • 旧字符串每次用完堆时都会被垃圾回收,所以一个聪明的实现可能永远不会给出异常。
  • 他们仍然需要存储结果字符串。因此,可能值得无限增加一个给定的字符串。
【解决方案3】:
List<Object> leak = new ArrayList<Object>();
while(true) {
    leak.add(new Object());
}

【讨论】:

    【解决方案4】:

    您可以通过运行一些如下所示的脚本来使用任意数量的内存:

    public static void main(String[] args)
    {
        List<String> l = new ArrayList<String>();
        for (long i = 0 ; i < 100000000l ; i++)
        {
            l.add(new String("AAAAAAA"));
        }
    }
    

    具有足够大的堆空间(例如 -Xmx1024M)。这样做的问题是,任何现代操作系统都会尝试使用虚拟内存来允许应用程序仍然运行,这将导致您的硬盘驱动器抖动而不是耗尽 JVM 的内存。您可能需要将您的操作系统总交换空间设置为实际遇到这种情况的固定值。

    【讨论】:

      【解决方案5】:

      这是一个小型 C 程序,它将消耗命令行中指定的字节数:

      #include <stdlib.h>
      int main(int argc, char *argv[]) {
        int bytes = atoi(argv[1]);
        char *buf = malloc(bytes);
        while (1) {
          int i;
          for (i = 0; i < bytes; i++) buf[i] += 1;
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2013-08-05
        • 2014-02-28
        • 2017-08-04
        • 2021-09-22
        • 2013-01-17
        • 1970-01-01
        • 1970-01-01
        • 2019-04-12
        相关资源
        最近更新 更多