本篇来聊聊java中内存回收机制。
如果有c++编程经验的朋友,肯定知道在c++中如果创建了一个对象,当不再使用的时候,需要手动调用delete方法来进行销毁。那么在java中我们为什么可以自由的创建对象而不用去考虑(其实也是要考虑的,只是平常忽略了它)?因为java提供了一套完整的垃圾回收机制(gc)。它会自动扫描内存中我们所创建过且不再使用的对象,进行自动销毁。听上去是不是很高端呢~
虽然听上去很不错并且它也确实能帮助我们自动销毁不用的对象,但它并非完美,因为我们在程序运行的时候,我们并不知道gc什么时候会来销毁那些我们所不再使用的对象,gc一般只有在资源开始紧张的时候,才会以独立的优先级的方式运行。事实上如果说gc足够完美的话,所谓的内存溢出是不是就很少出现了呢?然而现实中还是会出现内存溢出的情况的,这也从另一方面说明了gc的工作流程是不能被保证的。
下面我们要说说几个相关的方法,finalize(),System.gc(),System.runFinalization(),System.runFinalizersOnExit(true)。
finalize():
finalize方法是定义在Object对象中的:
protected void finalize() throws Throwable { }
该方法只有在gc开始着手清理该对象时,才会执行该方法,然而jvm并不是必定会执行该方法的,比如你的程序在退出前都没有释放过该资源,那么该方法就不会执行。所以如果你重写了该方法,并在其中写了一定的操作,那么它是不能被保证一定执行的。