当循环被评论时,程序给出错误

Abh*_*kra -1 java out-of-memory

我在我的java程序中发现了一个奇怪的行为,这里我的代码看起来像这样

public class JavaTest {

    private final int dataSize = (int) (Runtime.getRuntime().maxMemory() * 0.6);

    public void test() {
        {
            System.out.println(dataSize);
            byte[] data = new byte[dataSize];
        }

//      for (int i = 0; i < 10; i++) {
//          System.out.println("Please be so kind and release memory");
//      }

        System.out.println(dataSize);
        byte[] data2 = new byte[dataSize];
    }

    public static void main(String[] args) {
        JavaTest jmp = new JavaTest();
        jmp.test();
    }
}
Run Code Online (Sandbox Code Playgroud)

在这里,当我评论for循环时Exception in thread "main" java.lang.OutOfMemoryError: Java heap space,我得到的是我能理解jvm堆sapce已满.

但是在我的代码中使用该for循环,它会正确执行.怎么会?

Pre*_*ric 6

我认为这是因为你声明了byte[] data内部{ }块,这意味着data当代码块结束时,范围结束.在循环取消注释的情况下,您可能会给垃圾收集器留出时间来释放所占用的内存data.当你注释掉循环时,GC还没有时间释放内存.

如果去掉{ }周围data的声明,它也将抛出OutOfMemoryException即使循环注释.

UPDATE

@SubOptimal在评论中指出的这篇博文证明了这个理论是错误的,看起来它与GC释放内存所需的时间没有任何关系.我将引用博客中的相关部分

大多数响应都是不正确的,并建议for()循环要么让GC有时间在System.out.println()期间完成它的工作......

我的一些读者意识到它与System.out.println无关,而且一个简单的int i = 0; 就够了 如果在代码块之后立即声明任何局部变量,则在第二次调用新字节[]之前,中断对堆栈帧 1中保存的byte []的强引用.