Calling System.gc( ) explicitly?

The best way, in my opinion, to think of the System.gc() method is as a "hint" to the VM that garbage collection should run. That said, much like a large percentage of "optimizations" people think they are performing, it's usually best to just let the system take care of things on its own. Systems are evolving etc, etc, etc. There are still some instances where the developer may actually know better and the use case for it is probably very similar to why some code is still written in assembly (most of the time, the compiler is better, but in a few instances -- or with a few developers -- humans can actually write more efficient code).

One example I've seen used in the past to justify its existence is in the event that a large number of objects were allocated and you as the developer know the instant they are no longer going to be used. In that case, you may have more information about the memory utilization than the GC does (or at least, before it realizes it) and, since the amount of memory reclaimed will be significant, it makes sense to suggest that it runs.


You answered half of your question: is it worth it? No, because you can't force it.

Runs the garbage collector. Calling this method suggests that the Java virtual machine expend effort toward recycling unused objects in order to make the memory they currently occupy available for quick reuse.

This is almost EULA-English for "you can try but we both know the outcome". :)

Furthermore, application servers can (and often will) disable it using the -XX:-DisableExplicitGC command line option.

So what's the point then? Well, there could be one: some applications like to display the amount of free memory available on the heap, and before you refresh your display, it could be moderately useful to call System.gc(); before it.


Q: why we call the System.gc( ); function explicitly ?

A: Because somebody wrote bad code.

I think most people would agree that you shouldn't call System.gc() explicitly.

Let the system manage memory as it's supposed to. Any code relying on that for performance is most likely broken. Also, keep in mind that the JVM can entirely ignore your request.

If you want more information, I'd suggest reading the answers to:

java - why is it a bad practice to call System.gc?


There are some cases when calling System.gc() is useful:

  • You're going to run some benchmark, so you need to start in a well-defined state.
  • You're expecting some heavy load and want to get prepared as good as possible.
  • You have multiple servers and want to avoid pauses by scheduling GC on them periodically like here.

There may be more use cases, however, it's nothing you could expect to need soon. Most of the time it's better to let it do its work its way.