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

Каковы основные различия между сборкой мусора в С# и Java?

Недавно у меня был очень неправильный звуковой совет от "старшего" разработчика/коллеги в отношении сборщика мусора С#, такого как...

  • "Вам нужно использовать деструкторы везде в С#, потому что мусор на коллекционере нельзя полагаться ".

  • "Сборщик мусора С# не может быть думал, как мусор Java Коллектор".

Это звучит очень подозрительно для меня, насколько я знаю, различия между сборщиками мусора С# и Java выглядят следующим образом...

  • С# - это мусор для генерации сборщик, Java - параллельная метка развертки в 1.6, когда G1 является новым default (generational) мусор коллекционер с Java 7 и имеет был необязательным, так как ~ 1.6.21. До как я знаю
  • С# как язык имеет возможность вручную утилизировать объекты, которые реализовать IDisposable. Java должен всегда используйте сбор мусора, хотя некоторые структуры, такие как SWT требуют ручного вызова методов для освободить память в базовом собственный код.

Я понимаю, что Java и С# являются только языками, а сборщики мусора являются компонентом среды выполнения, однако для этого случая я конкретно говорю о Sun/Oracle JVM и Microsoft.NET Runtime.

Есть ли у кого-нибудь отзывы?

4b9b3361

Ответ 1

Совет, который вам дал, - это, в общем, нагрузка hooey.

Оба С# и Java имеют GC, которые пытаются оптимизировать быстрое восстановление множества мелких объектов. Они предназначены для решения одной и той же проблемы, они делают это по-разному, но как пользователь технические различия в вашем подходе к их использованию минимальны, даже не существуют для большинства пользователей.

IDisposable не имеет никакого отношения к GC как таковой. Это стандартный способ именования, который в противном случае назывался close, destroy, dispose и т.д., И часто их называют в Java. В Java 7 есть предложение добавить нечто очень похожее на ключевое слово using, которое вызовет аналогичный метод close.

"Деструкторы" в С# относятся к финализаторам - это было сделано намеренно, чтобы запутать программистов на C++.:) Сама спецификация CLR называет их финализаторами, точно так же, как JVM.

Существует множество способов различения Java и С#/CLR (типы пользовательских значений, свойства, генерики и все связанные с ними функции, известные как Linq), но GC - это одна из областей, где вы можете разработать значительное количество программного обеспечения прежде чем вам нужно будет много беспокоиться о различии между ними.

Ответ 2

Он обращается к деструкторам. Вам нужно не использовать деструкторы в С#, если это не важно. И если вы их используете, вы должны вызвать SuppressFinalize(), если вы знаете, что объект находится в состоянии, когда код деструктора больше не нужен (чаще всего потому, что при вызове IDisposable.Dispose() произошла одна и та же очистка. Если объект имеет деструктор и SuppressFinalize не был вызван, он будет работать дольше (так что он может вызвать вызов деструктора).

На сборник мусора наверняка можно положиться. Нельзя полагаться на деструктора или на то, чтобы сделать это в течение определенного времени, но это не вопрос надежности, это вопрос надежности сбора мусора, который является его работой!

Я не знаю много о сборщике мусора Java, и я не сомневаюсь, что он прав, говоря, что их нельзя воспринимать как друг друга, когда вы переходите к более тонким деталям, хотя я бы надеялся для Java-кодеров, что его можно рассматривать как .NET в большинстве случаев, а это вообще не нужно думать об этом, как правило, вам не нужно.

Ответ 3

Я боюсь, что ваш коллега неверен, но не за слово. Позволяет иметь связующий фейс!

Вот некоторые хорошие статьи по GC: http://msdn.microsoft.com/en-us/magazine/bb985010.aspx http://msdn.microsoft.com/en-us/magazine/bb985011.aspx

Кроме того, у Maoni WebLog есть отличные вещи (вы познакомитесь с последними, так как вышеприведенные статьи довольно старые): http://blogs.msdn.com/b/maoni/

Кроме того, только на этой неделе Раймонд Чен делает серию на GC: http://blogs.msdn.com/b/oldnewthing/archive/2010/08/13/10049634.aspx

Здесь хорошее обсуждение использования Dispose и Finalization: http://www.bluebytesoftware.com/blog/2005/04/08/DGUpdateDisposeFinalizationAndResourceManagement.aspx