After answering to a question about how to force-free objects in Java (the guy was clearing a 1.5GB HashMap) with System.gc()
, I've been told it's a bad practice to call System.gc()
manually, but the comments seemed mitigated about it. So much that no one dared to upvote it, nor downvote it.
I've been told there it's a bad practice, but then I've also been told garbage collector runs don't systematically stop the world anymore, and that it could also be only seen as a hint, so I'm kind of at loss.
I do understand that usually the JVM knows better than you when it needs to reclaim memory. I also understand that worrying about a few kilobytes of data is silly. And I also understand that even megabytes of data isn't what it was a few years back. But still, 1.5 gigabyte? And you know there's like 1.5 GB of data hanging around in memory; it's not like it's a shot in the dark. Is System.gc()
systematically bad, or is there some point at which it becomes okay?
So the question is actually double:
- Why is it or not a bad practice to call
System.gc()
? Is it really a hint under certain implementations, or is it always a full collection cycle? Are there really garbage collector implementations that can do their work without stopping the world? Please shed some light over the various assertions people have made. - Where's the threshold? Is it never a good idea to call
System.gc()
, or are there times when it's acceptable? If any, what are those times?