Каковы принципиальные различия между сборкой мусора в C # и Java? - PullRequest
30 голосов
/ 13 августа 2010

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

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

  • "Сборщик мусора в C # нельзя мысли как мусор Java Коллектор».

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

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

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

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

Ответы [ 3 ]

16 голосов
/ 13 августа 2010

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

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

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

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

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

3 голосов
/ 13 августа 2010

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

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

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

2 голосов
/ 13 августа 2010

Боюсь, ваш коллега не прав, но не верьте мне на слово.Давайте запустим фестиваль ссылок!

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

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

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

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

...