java中当内存不够时,垃圾回收器被调用回收内存中不用的对象
但是java里的对象并非总是被回收:
1.对象可能不被垃圾回收器回收。
2.垃圾回收器不等于“析构”。
java的GC回收完成全是自动的,没有提供相关的API手动回收,所有的内存分配和回收权限都在JVM,在开发人员手里没有绝对的强制垃圾回收的办法,不过可以这样去做:
1.对于不再引用的对象,及时把它的引用赋为null。obj=null;
2.如果内存确实很紧张,调用System.gc()方法来建议垃圾回收器开始回收垃圾,通知GC运行,但是java语言规范并不保证GC一定会执行。
注:在《深入理解JVM》一书中明确讲了,释放掉占据的内存空间是由gc完成,但是程序员无法明确强制其运行,该空间在不被引用的时候不一定会立即被释放,这取决于GC本身,无法由程序员通过代码控制。
其实这个gc()函数的作用只是提醒虚拟机:程序员希望进行一次垃圾回收。但是它不能保证垃圾回收一定会进行,而且具体什么时候进行是取决于具体的虚拟机的,不同的虚拟机有不同的对策。
其实原因是因为只有到“安全点”的线程才可以进行GC操作回收内存,《深入理解JVM》中提到的“安全点”是在线程运行中设置的位置,当线程运行到安全点的位置,发现有GC要求时,才会产生GC操作。