views:

323

answers:

4

Garbage collection is called automatically when an object is refered to is no longer available to any variable. But I like know why do we call explicitly using System.gc() when garbage collection is called automatically.When do we call System.gc();

+5  A: 

We don't.

We just don't.

Perhaps my experience is limited, but I have not once found it necessary to call System.gc().

I will quote Brian Goetz on the performance aspect (if you haven't heard of him, look him up -- and read the rest of this article, too):

A third category where developers often mistakenly think they are helping the garbage collector is the use of System.gc(), which triggers a garbage collection (actually, it merely suggests that this might be a good time for a garbage collection). Unfortunately, System.gc() triggers a full collection, which includes tracing all live objects in the heap and sweeping and compacting the old generation. This can be a lot of work.

In general, it is better to let the system decide when it needs to collect the heap, and whether or not to do a full collection.

Michael Myers
+9  A: 

You don't. As you say, garbage collection is automatic. System.gc() doesn't even force a garbage collection; it's simply a hint to the JVM that "now may be a good time to clean up a bit"

In general, trying to force the garbage collector to do what you want with System.gc() is a hack applied by people who think they know better than they actually do, or as an (attempted) workaround for broken code.

I've been writing Java for years and I've yet to see a situation where calling System.gc was really the right thing to do (in anything I've written)

Steven Schlansker
I've seen flawed code that actually runs slower with System.gc(), by developers thinking they know better.
Chris Dennett
Some implementations of the JVM (mostly for embedded/low end hardware) promise to garbage collect when System.gc() is called. Still you should never need this.
Thirler
Many garbage collection algorithms interrupt your program, blocking execution on all threads until the reaping is complete. Calling `System.gc()` too frequently will severely hurt performance and is (almost) always unnecessary.
Matthew
+1  A: 

You don't need it. Think of it as a diagnostic tool, like being able to write to a debug console.

For example, imagine that if you were doing benchmarking, you would want to tell the GC to collect garbage after each benchmark run.

Gabe
A: 

You do need it. It is very useful no matter what these other people say.

A usage example: Say that you have just finished a long background task that has used a lot of memory. None of those objects are going to be used again. Since the task took a long time the user isn't going to care about another 5-10 seconds. This is a good time to garbage collect.

If you don't GC at that point, it is going to happen later. Probably during interactive use of the program at which point the user experience gets choppy.

Zan Lynx