Создание списка на основе другого списка для уменьшения использования памяти

Если я вызываю какую-то внешнюю библиотеку, которая возвращает List[LargeObjects], то есть список с объектами, которые имеют много полей, это займет большую часть памяти в куче. Однако меня интересует только name (Строка) поле каждого элемента. Итак, если у меня есть этот код:

externalLib.getLargeObjects.map(e => e.name) match {
  case l: List[String] =>
    ???
  case _ =>
    ???
}

Будет ли JVM GC (в какой-то момент) освободить память, занятую List[LargeObjects] (поскольку он разыменовывается и не используется после name список создан) что позволяет мне иметь больше свободной памяти?

1 ответ

Решение

Будет ли JVM GC (в какой-то момент) освободить память, занятую List[LargeObjects] (поскольку он разыменовывается и не используется после создания списка имен), что позволяет мне иметь больше свободной памяти?

Если никто не ссылается на большой список, и вы проецируете строки только из этих больших объектов, то JVM будет собирать их, как только что-то запускает GC при их сохранении.

Когда GC подойдет к графику живых объектов, он увидит, что есть живые ссылки на ваши String объекты. Что касается списка, если никто не ссылается на него, он будет считать его мертвым и заберет его.

Другие вопросы по тегам