当一个对象失去引用后,系统何时调用它的finalize()方法对它进行资源清理,何时它可以变成不可达状态,系统何时回收它占有的内存,对于程序完全透明。程序只能控制一个对象不再被任何引用变量引用,不能控制它何时被回收。
程序可以强制系统进行垃圾回收——这种强制只是通知系统进行垃圾回收,但系统是否进行垃圾回收依然不能确定。大部分时候,程序强制垃圾回收后总是有一些效果:
方法1:调用System类的gc()静态方法:System.gc()
方法2:调用Runtime对象的gc()实例方法:Runtime.getRuntime().gc()
"强制系统垃圾回收有如下两个方法。 调用System类的gc()静态方法:System.gc() 调用Runtime对象的gc()实例方法:Runtime.getRuntime().gc()"
当对象对当前使用这个对象的应用程序变得不可触及的时百候,这个对象就可以被回收了。
java垃圾回收是有jvm自动执行的,不是人为操作的,所以当不存在对某对度象的任何引用时,该对象就处于被jvm回收的状态,并不是马上予以销毁。 class Animal { public static void main(String[] args) { Animal lion = new Animal(); System.out.println("Main is completed."); } protected void finalize() { System.out.println("Rest in Peace!"); } }
lion 对象在实例化行后从未被使用过。因此 Java 编译器作为一种优化措施可以直接在实例化行后赋值lion = null。因此,即使在 SOP 输出知之前, finalize 函数也能够打印出 'Rest in Peace!'。不能证明这确定会发生,因为它依赖JVM的实现方式和运行时使用的内存。如果编译器看到该实例在未来再也不道会被引用,能够选择并提早释放实例空间。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。