2010-10-18 2 views
3

Этот вопрос об объектах Scala, которые определены что-то вроде этого:Когда объекты Scala собирают мусор?

object Pipeline { 
    val dispatcher = new Dispatcher 
} 

Я знаю, что в некоторых случаях они называются объектами «компаньона», хотя я до сих пор не понимают различия , Во всяком случае, я хочу знать, когда они собирают мусор. Итак, в приведенном выше примере я хотел бы знать, когда память, занятая dispatcher, будет восстановлена, если вообще когда-либо.

+2

«Компонентный объект» - это объект, который имеет то же имя, что и некоторый класс в том же исходном файле, например 'class Foo' и' object Foo'. – 2010-10-18 05:30:31

ответ

10

При компиляции в jave байт-код сопутствующие объекты lazyily инициализируют статические члены. Для большинства реализаций Java это означает, что они будут иметь право на сбор, когда загрузчик классов, загружающий объект, имеет право на сбор. Однако это действительно сложный процесс реализации.

+8

... что во многих случаях означает: никогда –

6

Объект Pipeline всегда «доступен», а также диспетчер (аналогично статическому полю в Java), поэтому я предполагаю, что это не сбор мусора. Если вы хотите, чтобы контролировать жизненный цикл диспетчера, вы могли бы сделать что-то вроде

object Pipeline { 
    var dispatcher = Some(new Dispatcher) 
    def close() { dispatcher = None } 
} 
3

Как предложено другой пользователь, объект имеет право на инкассо только тогда, когда его Загрузчик классов могут быть собраны. Если у вас нет настраиваемой схемы загрузки классов, это означает, что dispatcher не собирается, и память, в которой он нуждается, никогда не освобождается (предполагая, что объект был инициализирован в первую очередь).

За исключением ручной переустановки поля dispatcher, чтобы сделать соответствующий объект Dispatcher доступным для сбора, вы всегда можете автоматизировать этот процесс, используя SoftReference.

Смежные вопросы