<临时理解,可能有误,谨慎参考>
gc()只能回收Java堆上的内存,而不能回收栈中的内存,一般情况下Java中new的对象都是在堆中分配内存,因此gc回收堆内存没有问题,但是如果以某些特殊方法在栈中分配内存那么gc是无法释放这些内存的,这种情况下一般是通过finalize释放的,Java的gc回收之前会调用对象的finalize方法,但是要注意一点,即使是程序员显式调用gc也不一定会触发垃圾回收,垃圾回收一般只会在内存不够用的时候才会触发,显式的调用gc只是一种建议,因此可能造成的结果就是finalize方法长期不被执行进而长期占用内存,最终因内存占用较多触发垃圾回收,这种触发其实是一种比较不正常的触发(增加gc触发次数),因为垃圾回收会消耗较多的资源,如非必要尽量不要触发。