【问题标题】:What is an OutOfMemoryError exception, and how can I produce it? [closed]什么是 OutOfMemoryError 异常,如何产生它? [关闭]
【发布时间】:2012-03-22 00:05:41
【问题描述】:

对于一个涉及异常处理的家庭作业,我需要产生一个 OutOfMemoryError 异常,这样我就可以编写一个 try-catch 并捕获它:

"13.10 (OutOfMemoryError) 编写一个程序,导致 JVM 抛出一个 OutOfMemoryError 并捕获并处理此错误。”

我搜索了 Java API,但在异常列表中找不到有关 OutOfMemoryError 异常的任何内容。什么是 OutOfMemoryError 异常,如何为我的作业生成异常?

【问题讨论】:

  • 您在搜索 OOME 时发现了什么?
  • 提示:异常/错误的名称是什么?
  • 如何在 OutOfMemoryError 上查找 Java API 信息:转到 API Docs,按 Ctrl+F,输入 OutOfMemoryError,然后按 Enter。
  • 这是英制还是公制的废话?请澄清。
  • 这个问题似乎是题外话,因为它已由文档回答。

标签: java exception exception-handling


【解决方案1】:

比创建数百万个对象要简单得多(并且保证可以工作):

public static void throwOomE() {
    throw new well, you can just search for the rest of the answer
}

【讨论】:

  • 我正要建议这个,+1
【解决方案2】:

我能想到的最简单的方法:

for (String x = "x";; x += x);

您可能需要一些创意以更快地崩溃。

【讨论】:

  • 在你写“for(;;) {x = x + 1}”之前以这种方式写一个for循环是什么意思?还有,谢谢!”
  • @Zolani: for(;;) 是一个无限循环。
【解决方案3】:

当 JVM 无法分配足够的内存来完成请求的操作时,抛出 OutOfMemoryError。

要产生这些,只需在循环中分配一堆内存或类似的东西,但请记住保留已经分配的对象,最好是在 ArrayList 或其他东西中,否则垃圾收集器可能会重用空间并释放一些内存。

类似

ArrayList<Object> list = new ArrayList<Object>();

try {
    while ( true )
        list.add( new Object() );
} catch ( OutOfMemoryError e ) {
    // And we are done...
}

您可能希望将 Object 替换为占用大量空间的类,否则这可能需要一些时间。

参考: http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/OutOfMemoryError.html

【讨论】:

    【解决方案4】:

    就像我处理每个与 java 相关的问题一样,我做的第一件事就是谷歌:

    java 6 <class-name>
    

    换句话说:

    java 6 OutOfMemoryError
    

    我得到了这个信息链接作为第一个结果:

    http://docs.oracle.com/javase/6/docs/api/java/lang/OutOfMemoryError.html

    【讨论】:

    • 让我为你雅虎...
    【解决方案5】:

    我最喜欢的做法是。

    byte[] crasher = new byte[Integer.MAX_VALUE];
    

    【讨论】:

      【解决方案6】:

      当用于分配新对象的内存不足时,VM 会抛出 OutOfMemoryError。因此,当您创建太多对象时,您可能会导致此异常发生。

      为此,请在无限循环中开始创建不会被垃圾收集器收集的对象(例如,将它们相互链接)——VM 最终将耗尽下一个对象的可用内存分配,抛出异常。当你抓住它时,要小心,因为你不能做太多事情——VM 没有(太多)内存用于任何操作。

      【讨论】:

        【解决方案7】:

        OutOfMemoryException 当您的heap 不包含新对象的可用空间时出现。 此外,您应该在某处保留对象的引用,否则 garbage colector 会关心它们。

        二进制崩溃(每次迭代所需的字节数翻倍:)

        String x = "1";
        while (true){
            x = (x + x);
        }
        

        ** 阅读所有参考资料以便更好地理解

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-08-05
          • 1970-01-01
          • 1970-01-01
          • 2011-04-23
          • 2015-12-01
          • 2013-01-05
          • 1970-01-01
          相关资源
          最近更新 更多