объяснение сборщика мусора - ошибка распределения - PullRequest
0 голосов
/ 26 августа 2018

В настоящее время я изучаю ошибку производительности в игре Minecraft ( оригинальный пост ).Последнее, что мне нужно было проверить - это вывод сборщика мусора.Когда я это сделал, я заметил, что 99% всех выходов были [GC (Allocation Failure).... Вот небольшая выборка выходных данных:

13.238: [GC (Allocation Failure)  805728K->167001K(1601024K), 0.0251328 secs]
13.907: [GC (Allocation Failure)  805977K->167208K(1618432K), 0.0257168 secs]
14.559: [GC (Allocation Failure)  802088K->167520K(1597440K), 0.0262393 secs]
15.257: [GC (Allocation Failure)  802400K->168597K(1622016K), 0.0281692 secs]
15.925: [GC (Allocation Failure)  805525K->170531K(1618944K), 0.0202619 secs]
27.474: [GC (Allocation Failure)  807459K->178239K(1626624K), 0.0239986 secs]
27.884: [GC (System.gc())  215249K->179128K(1624576K), 0.0286153 secs]
27.913: [Full GC (System.gc())  179128K->167443K(1624576K), 0.4367059 secs]

Что именно это означает?Я нашел другой пост , в котором говорилось об этом, но я не мог полностью понять, что они имели в виду.Может ли кто-нибудь объяснить мне это на «детском языке»?

1 Ответ

0 голосов
/ 27 августа 2018

В ответ на вопрос я попытаюсь перефразировать ответ на Java GC (Ошибка выделения) на языке ребенка.

JVM всегда поддерживает большой кусок свободной памяти в куче для новых выделений.

Обычно при выполнении new Something() часть памяти отщепляется от этого свободного куска памяти.Это нормальное распределение.

Хотя, в конце концов, свободный чанк исчерпался, и следующая попытка чипировать часть памяти потерпит неудачу - allocation failure.

Это сигнал для сборки мусора.Сборка мусора делает свое дело, находит мертвые объекты, сжимает восстановленную память в большой свободный кусок и цикл продолжается.

Другими словами allocation failure - это совершенно нормальная ситуация для JVM.

В действительности все немного сложнее.Есть две части кучи (молодой и старый пробелы), локальные буферные потоки и т. Д.

...