Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 注释for循环时,程序给出错误_Java_Out Of Memory - Fatal编程技术网

Java 注释for循环时,程序给出错误

Java 注释for循环时,程序给出错误,java,out-of-memory,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[da

我在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();
    }
}
在这里,当我评论for循环时,我在线程main java.lang.OutOfMemoryError中遇到异常:我可以理解jvm堆sapce的java堆空间已满


但在我的代码中有了for循环,它就可以正常执行了。这是怎么回事?

我认为这是因为您在{}块中声明了byte[]数据,这意味着当代码块结束时,数据的作用域就结束了。在未注释循环的情况下,您可能会给垃圾收集器一些时间来释放数据占用的内存。当您注释掉循环时,GC还没有时间释放内存

如果删除数据声明周围的{},即使循环未注释,它也会抛出OutOfMemoryException

更新

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

大多数响应都是不正确的,并表明for循环要么给GC时间在System.out.println

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


你能把你的代码适当地缩进吗?这很难阅读。请阅读来自@HeinzKabutz的这篇时事通讯,我在取消对for循环的注释时,正在执行out-the-loop及其out-of-memoryError。同样的通知:刚刚发布此消息,发现您的答案,在我看来也是合乎逻辑的。@Yazan:起初很奇怪,直到我看到{},当我第一次阅读这个问题时,我没有注意到它。直到我将代码复制到eclipse,CTRL+SHIFT+F。。。然后你好:根据评论中@SubOptimal的链接,这是不正确的。然而,当我尝试时,它甚至只为一个数组提供了OOM,所以我无法真正测试它…@tobias_k你说得对,我将用那篇博文中的信息编辑我的答案。谢谢