сборщик мусора Java не работает, как ожидалось - PullRequest
0 голосов
/ 13 ноября 2018

мой вопрос прост .. если вы запустите следующую программу на любой машине, куча быстро заполнится. так почему GC не достаточно быстр, чтобы освободить память. и когда куча полна всего «новые неиспользованные объекты». почему они втыкаются в кучу !!

public class TestGc {

public String name;

public TestGc next;

public TestGc(String name) {
    this.name = name;
}

public static TestGc create(String nm, int len) {
    TestGc[] tmp = new TestGc[len];
    TestGc prev = null;
    for (int i = 0; i < len; i++) {
        TestGc cur = new TestGc(nm + i);
        tmp[i] = cur;
        if (prev != null)
            prev.next = cur;

        prev = cur;
    }
    return tmp[0];
}

public static void main(String[] args) {
    if (args.length != 1) {
        System.err.println("Usage: TestGc <number of roots");
        return;
    }

    int num = Integer.valueOf(args[0]);

    long start = System.currentTimeMillis();

    TestGc[] arr = new TestGc[num];
    for (int i = 0, j = 0; i < 1000; i++, j++) {
        if (j == num)
            j = 0;
        String nm = "root_" + i + "_";
        System.out.println("******** " + nm);
        arr[j] = create(nm, 1000000);
    }
    double duration = (System.currentTimeMillis() - start) / 1000.0;
    System.out.println("******** duration " + duration + " sec.");
}

}

java -Xmx23g -Xms23g -server -XX:+UseG1GC -XX:+PrintGCDateStamps -XX:+PrintGCDetails TestGc 150

пример скопирован отсюда. https://bugs.openjdk.java.net/browse/JDK-8065402

1 Ответ

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

Это происходит потому, что все объекты, кроме массива, на который ссылается tmp в методе create, достижимы, поэтому они не должны утилизироваться GC.

...