Java OutOfMemoryError 没有抛出

标签 java memory-management

我试图研究 Java 中的不同异常并遇到了 OutOfMemoryError,我想在工作中看到它,所以我编写了以下程序来创建无限对象,方法是在无限循环中创建它们。该程序确实进入无限循环,它不会抛出 OutOfMemoryError 异常。

class Test {
    public static void main(String...args) {
        while(true) {
            Integer i = new Integer();
        }
    }
}

最佳答案

您走在正确的轨道上。您唯一缺少的是垃圾收集的概念。该程序实际上创建了无限 Integer 对象,但在第一次迭代之后,在前一次迭代中创建的对象符合 GC 条件。

考虑一下:

Integer i;    
i = new Integer(); // 1. create new object and make reference variable i refer to it.
i = new Integer(); // 2. create another object and make reference variable i refer to it...there is no way to get to the object created in step1 so obj in step 1 is eligible for GC.

如果您想看到 OutOfMemoryError,您需要以某种方式确保有一种方法可以访问在无限循环中创建的对象。所以你可以这样做:

class Test {
 public static void main(String...args) {
  Vector v = new Vector(); // create a new vector.
  while(true) {
   v.addElement(new Integer(1)); // create a new Integer and add it to vector.
  }
 }
}

在这个程序中,整数对象像以前一样无限创建,但现在我将它们添加到一个 vector 中,以确保有一种方法可以访问它们并且它们不会成为 GC 合格的。

关于Java OutOfMemoryError 没有抛出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2261465/

相关文章:

Java keyListener 不适用于 BasicConstruct

java - 如何使用 BorderLayout 排列组件?

spring - 如何监控 spring + tomcat 应用程序中的内存?

java - 如何将 jsonobject 添加到我想要的 jsonarray 中

java - 具有重复名称的 WSDL——如何强制使用 Java 类名称

c++ - 动态与静态内存在清洁度和速度方面的最佳实践

C++ 这里发生了什么

c - 从节点到根遍历树,跟踪路径

c - 如何使用指向切片字符串的指针的指针

java - 在纵向和横向之间翻转时随机生成的单词会发生变化