Подтвердить что ты не робот

.Net против сборщика мусора Java

Кто-нибудь знает основные различия между сборщиками мусора Java и .Net? Веб-поиск не показал много, и это был вопрос, который возник в тесте.

4b9b3361

Ответ 1

Разница между CLR (.Net) GC и JVM GC, а не самими языками. Оба могут быть изменены и спецификация их поведения свободна, чтобы это можно было изменить, не влияя на правильность программ.

Есть некоторые исторические различия, в основном из-за того, что .Net разрабатывается с уроками эволюции java (и других платформ на основе gc). В следующем случае не предполагайте, что .Net был каким-то образом превосходным, потому что он включал функциональность с самого начала, это просто результат следующего.

Заметная очевидная разница заключается в том, что MS GC раскрывает свой характер поколений (через GC api), это, вероятно, останется верным в течение некоторого времени, поскольку это очевидный подход к принятию на основе поведения, которое проявляет большинство программ: Most распределения крайне недолговечны.

У начального JVM не было коллективных сборщиков мусора, хотя эта функция была быстро добавлена. Первые коллекторы поколений, реализованные в Sun Oracle, а другие - Mark и Sweep. Было осознано, что подход с меткой-разверткой и компактностью приведет к значительному улучшению местоположения памяти, оправдывая дополнительные накладные расходы на копирование. Среда CLR дебютировала с таким поведением.

Разница между Sun Oracle и реализация Microsoft "ethos" - одна из конфигураций.

Sun предоставляет огромное количество опций (в командной строке) для настройки аспектов GC или переключения между различными режимами. Многие опции имеют -X или -XX, чтобы указать на отсутствие поддержки у разных версий или поставщиков. CLR, напротив, обеспечивает отсутствие конфигурации; ваш единственный реальный вариант - использование серверных или клиентских коллекционеров, которые оптимизируют для латентности пропускной способности соответственно.

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

Ответ 2

Это просто добавить отличный ответ ShuggyCoUk. В .NET GC также используется то, что известно как куча больших объектов (LOH). CLR предопределяет кучу объектов на LOH, и все объекты, выделенные пользователем не менее 85000 байт, также распределяются на LOH. Кроме того, double[] из 1000 элементов или более выделяется на LOH также из-за некоторой внутренней оптимизации.

LOH обрабатывается по-разному, чем кучи поколений различными способами:

  • Он очищается только во время полного сбора и никогда не уплотняется, как кучи поколений.
  • Выделение из LOH осуществляется через бесплатный список, так как malloc обрабатывается в среде выполнения C, тогда как распределения из кучи генерации в основном выполняются путем простого перемещения указателя в генерации 0.

Я не знаю, имеет ли JVM что-то подобное, но это важная информация о том, как память обрабатывается в .NET, поэтому, надеюсь, вы сочтете это полезным.

Ответ 3

Если я правильно помню, JVM не освобождает освобожденную память обратно в операционную систему, как это делает CLR.

Ответ 5

Я нашел это:

В платформе J2SE версии 1.4.2 было четыре сборщика мусора, из которых можно было выбирать, но без явного выбора пользователем всегда выбирался серийный сборщик мусора. В версии 5.0 выбор коллектора основан на классе машины, на которой запущено приложение.

здесь и этот

Также, как JVM управляет уничтожением объектов, так и CLR с помощью алгоритма сбора мусора Mark and Compact

здесь

Надеюсь, это поможет...