Кто-нибудь знает основные различия между сборщиками мусора Java и .Net? Веб-поиск не показал много, и это был вопрос, который возник в тесте.
.Net против сборщика мусора Java
Ответ 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.
Ответ 4
В Java 5 внесено множество изменений в алгоритмы GC.
Я не С# maven, но эти две статьи подсказывают мне, что оба они эволюционировали от простой маркировки и развертки и к новым моделям поколений:
http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html http://www.csharphelp.com/archives2/archive297.html
Ответ 5
Я нашел это:
В платформе J2SE версии 1.4.2 было четыре сборщика мусора, из которых можно было выбирать, но без явного выбора пользователем всегда выбирался серийный сборщик мусора. В версии 5.0 выбор коллектора основан на классе машины, на которой запущено приложение.
здесь и этот
Также, как JVM управляет уничтожением объектов, так и CLR с помощью алгоритма сбора мусора Mark and Compact
Надеюсь, это поможет...