JVM - Почему YoungGen использовал уменьшение кучи между GC? - PullRequest
0 голосов
/ 13 декабря 2018

Ниже приведен график GCViewer для некоторых исполнителей Apache Spark:

  1. Куча использованного старого поколения
  2. Куча использованного молодого поколения
  3. Время GC
  4. Явления, о которых идет речь

Я пытаюсь понять наклон в (4).Зачем запускать gc до того, как будет использована вся куча молодого поколения (как предыдущие фазы gcs)?И почему он будет продолжать монотонно снижаться в течение ~ 5 минут, прежде чем снова начнет расти?Я думал, что это может произойти, если, например, выделен очень большой объект (например, чтение из сокета io).Но это, вероятно, неправильно, так как старый ген не изменился после этого.Мне не особо важен этот пример, а скорее просто узнать немного больше об управлении памятью jvm.

enter image description here

1 Ответ

0 голосов
/ 13 декабря 2018

Одним из возможных объяснений, которое я могу придумать, будет результат использования блоков локального выделения потока (TLAB).Во избежание конфликта по одному указателю на пространство Eden, используемое несколькими потоками, каждый поток приложения имеет свой собственный указатель на блок памяти в пространстве Eden.Когда TLAB используется, выделяется новый (это может также включать выделение большего блока, чтобы можно было сгладить различия между скоростями выделения потоков).

Следствием этого является то, что часто будет неиспользуемое пространствов TLAB, когда требуется GC (потому что одному потоку нужен новый TLAB, и для него недостаточно места).Может возникнуть ситуация, когда количество места, оставшегося в TLAB, увеличивается из-за скорости выделения других потоков.

Поскольку это все молодое поколение, также возможно, что вПространства выживших, которые получают право на работу со скоростью, которая может привести к уменьшению количества используемого пространства следующим образом.

К сожалению, из представленных данных невозможно дать однозначный ответ.

...