Как MonoTouch собирает мусор?

Are details of the MonoTouch garbage collection published anywhere? I am interested in knowing how it works on the iPhone. I'd like to know:

  • How often it runs, and are there any constraints that might stop it running.
  • Whether it is completely thread safe, so objects passed from one thread to another are handled properly, of if there are constraints we should be aware of.
  • If there is any benefit in manually calling the garbage collector before initiating an action that will use memory.
  • How does it handle low memory notifications, and running out of memory.

    Такая информация поможет нам понять информацию о стеках и потоках, которую мы получаем из журналов приложений.

    [Изменить] Теперь я нашел информацию по адресу Hans Boehm's. сайт, но это очень общий и перечисляет различные варианты и варианты, которые есть у разработчика, включая то, как обрабатываются потоки. Конкретная информация MonoTouch - это то, что мне здесь нужно.


  • person mj2008    schedule 21.04.2011    source источник


    Ответы (1)


    Сборщик мусора тот же, что и в Mono, исходный код здесь:

    https://github.com/mono/mono/tree/master/libgc

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

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

    На самом деле это не вопрос сборщика мусора, а вопрос API. И это сильно зависит от API, который вы вызываете. Правила такие же, как и для .NET: методы экземпляра никогда не являются потокобезопасными, статические методы по умолчанию являются потокобезопасными. Если в API прямо не указано, что это не так.

    Теперь с API-интерфейсами пользовательского интерфейса, такими как UIKit или CoreGraphics, они ничем не отличаются от любого другого инструментария графического интерфейса, доступного в мире. Инструментарий пользовательского интерфейса не является потокобезопасным, поэтому вы не можете предположить, что UILabel, созданный в основном потоке, может быть безопасно доступен из потока. Вот почему вы должны вызывать «BeginInvokeOnMainThread» для NSObject, чтобы гарантировать, что любые методы, которые вы вызываете для объектов UIKit, выполняются только без основного потока.

    Это просто на примере.

    Посетите http://monotouch.net/Documentation/Threading для получения дополнительной информации.

    Уведомления о нехватке памяти доставляются операционной системой вашим UIViewControllers, а не сборщику мусора Mono, поэтому в таких случаях вам необходимо предпринять соответствующие действия.

    person miguel.de.icaza    schedule 22.04.2011
    comment
    Однако теперь есть GC 2-го поколения, на который стоит обратить внимание. - person Dylan; 01.04.2012