The garbage collector will call it at an appropriate time. According to Bruce Eckel in his Thinking in Java:
"....When the garbage collector is ready to release the storage used for your object, it will first call finalize( ), and only on the next garbage-collection pass will it reclaim the object’s memory. So if you choose to use finalize( ), it gives you the ability to perform some important cleanup at the time of garbage collection. "