Java: Вопрос: может ли эта программа утекать при создании массива Java каждый раз в течение времени, проходя через метод, может утечка памяти? - PullRequest
0 голосов
/ 05 ноября 2018

Я сделал этот пример, передавая -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;
}

}

1 Ответ

0 голосов
/ 05 ноября 2018

Здесь нет утечки памяти.

Простое создание объекта или массива и последующее удаление его ссылки «на полу» не приводит к утечке памяти. Сборщик мусора обнаружит, что объект / массив более недоступен и удалит его. Это не произойдет сразу, но произойдет до того, как вашему приложению не хватит памяти.

В Java утечка памяти происходит, когда объекты все еще достижимы, и их не должно быть. ГХ не знает, что объекты больше не будут использоваться, и просто хранит их.

Например, если вы храните список всех этих массивов в ArrayList, на который ссылается переменная static. Сборщик не может знать, нужны ли эти объекты (действительно) вашей программе. Так как они достижимы, они сохраняют их. Если вы продолжаете делать это, у вас заканчивается память.


Если вы получаете OOME с этой программой, это не связано с утечкой памяти. Это будет связано с тем, что куча слишком мала. Но я не думаю, что это вероятно: 200 000 x 3 x 8 байт - это меньше 5 мегабайт, и вы увеличили кучу до 64 мегабайт.

Вы могли бы повторно использовать эти массивы, чтобы уменьшить отток создания / удаления объектов, но неясно, стоит ли это того. Ваш пример кода не является представителем реального приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...