41. 如何手动触发全量回收垃圾,如何立即触发垃圾回收
垃圾回收机制具有的特征
- 垃圾回收机制只负责回收堆内存的对象,不会回收任何物理资源(例如数据库连接、网络IO等资源)
- 程序无法精确控制垃圾回收的运行,垃圾回收会在合适的时候进行。当对象永久地失去引用后,系统就会在合适的时候回收它所占的内存
- 在垃圾回收机制回收任何对象之前,总会先调用它的finalize()方法,该方法可能使该对象重新复活(让一个引用变量重新引用该对象),从而导致垃圾回收机制取消回收。
对象在内存中的状态
- 可达状态:当一个对象被创建后,若有一个以上的引用变量引用它,则这个对象在程序中处于可达状态。
- 可恢复状态:如果程序中某个对象不再有任何引用变量引用它,它就进入了可恢复状态。
- 不可达状态:当对象与所有引用变量的关联都被切断,且系统已经调用所有对象的finalize()方法后依然没有使对象变成可达状态,那么这个对象将永久的失去引用,最后变成不可达状态。
public static void main(String[] args) { String a = new String("Grim"); a = new String("Mjx"); }
第一句对象"Grim"为可达状态,执行第二句之后"Mjx"是可达状态。但是"Grim"这个字符串对象变成了可恢复状态。
强制触发垃圾回收方法
- 调用System类的gc()静态方法:System.gc();
- 调用Runtime对象的gc()实例方法:Runtime.getRuntime().gc();