I had some very wrong sounding advice recently from a “senior” developer/coworker regarding the C# garbage collector such as…
-
“You need to use destructors
everywhere in C# because the garbage
collector cannot be relied upon.” -
“The C# garbage collector cannot be
thought of like the Java garbage
collector”.
This sounds extremely fishy to me, as far as I know the differences between the C# and Java garbage collectors are as follows…
- The C# is a Generational garbage
collector, Java is concurrent mark
sweep in 1.6 with G1 being the new
default (generational) garbage
collector featuring Java 7 and has
been optional since ~1.6.21. As far
as I know - C# as a language has the ability to
manually dispose of objects that
implementIDisposable. Java must
always use garbage collection,
although some frameworks like SWT
require you manually call methods to
release memory in the underlying
native code.
I realize that Java and C# are just the languages and the garbage collectors are a component of the runtime, however for this case I am specifically speaking about the Sun/Oracle JVM and the Microsoft .NET Runtime.
Does anybody have feedback?
The advice you’ve been given is, broadly speaking, a load of hooey.
Both C# and Java have GCs that attempt to optimise the fast recovery of lots of small objects. They’re designed to solve the same problem, they do it in slightly different ways but as a user the technical differences in your approach to using them is minimal, even non-existent for the majority of users.
IDisposableis nothing to do with the GC as such. It’s a standard way of naming methods that would otherwise be calledclose,destroy,dispose, etc., and often are called that in Java. There is a proposal for Java 7 to add something very similar to theusingkeyword that would call a similarclosemethod.“Destructors” in C# refers to finalizers – this was done deliberately to confuse C++ programmers. 🙂 The CLR spec itself calls them finalizers, exactly as the JVM does.
There are many ways in which Java and C#/CLR differ (user value types, properties, generics and the whole family of related features known as Linq), but the GC is one area where you can develop a substantial amount of software before you need to worry much about the difference between them.