猿问

Java: 问题:这个程序是否会在每次通过一个方法时创建 java 数组而泄漏内存?

我做了这个例子,通过 -Xmx64m


我知道这个程序不会泄漏内存(或不泄漏?)。但是我不知道垃圾收集器是怎么做的,因为每次我创建一个新的双数组时。


该程序是否可能存在内存泄漏?因为每次我都会创建一个新的双打数组?


Garbege 收集器在哪里收集新的替身?


public class TestLeakMemory {


private static float total;


public static void main(String[] args) throws InterruptedException {

    long currtime = System.currentTimeMillis();

    long timeElapsed = 0;

    long lastTime = 0;

    long count = 0;

    while (timeElapsed < 6000000) {

        //Thread.sleep(100);

        count++;


        double arr1[] = new double[200000];

        double arr2[] = new double[200000];

        double arr3[] = new double[200000];

        float doSomething = doSomething(arr1, arr2, arr3);


        total += doSomething;


        timeElapsed = System.currentTimeMillis() - currtime;


        if (System.currentTimeMillis() - lastTime > 3000) {

            System.out.println("totalMemory: " + Runtime.getRuntime().totalMemory() + ", freeMemory: " + Runtime.getRuntime().freeMemory() + ", count: " + count);

            lastTime = System.currentTimeMillis();

        }

    }


    System.out.println(total);

}


private static float doSomething(double[] arr1, double[] arr2, double[] arr3) {

    float total = 0;

    for (double d : arr1) {

        total += d;

    }

    for (double d : arr2) {

        total += d;

    }

    for (double d : arr3) {

        total += d;

    }


    return total;

}

}


FFIVE
浏览 108回答 1
1回答

狐的传说

这里没有内存泄漏。只是创建一个对象或数组,然后将其引用“放在地板上”不会造成内存泄漏。垃圾收集器会发现对象/数组不再可达并删除它。这不会立即发生,但会在您的应用程序内存不足之前发生。在 Java 中,当对象仍然可以访问而不应该访问时,就会发生内存泄漏。GC 不知道这些对象不会被再次使用,只会保留它们。例如,如果您在变量ArrayList引用的 a 中保留所有这些数组的列表static。收集器无法知道您的程序是否(真的)需要这些对象。因此,由于它们是可访问的,因此它保留了它们。如果你继续这样做,你就会耗尽内存。如果您使用该程序获得 OOME,则不是由于内存泄漏。这将是由于堆太小。但我认为这不太可能:200,000 x 3 x 8 字节小于 5 兆字节,而您已将堆限制为 64 兆字节。您可以重用这些数组来减少对象创建/删除的流失,但尚不清楚这是否值得。您的示例代码并不代表真正的应用程序。
随时随地看视频慕课网APP

相关分类

Java
我要回答