java初学者实践教程14-垃圾收集器
用过C++编程的人都知道,编译的时候总是要跟踪创建的对象,需要显式删除没有使用的对象。这种方法太麻烦,容易出错。写了这么多代码,还能记住吗?把有用的删了怎么办?忘记删除没用的怎么办?这些问题非常严重。java语言中使用的垃圾收集器管理内存既方便又安全。垃圾收集器可以自动确定哪个对象不再使用,可以自动删除它。这也是java语言的一大优势。
如果我们要显示删除一个对象的引用,也很简单。难道就不能把引用的变量赋值为null吗?对于垃圾收集器来说,当程序员创建一个对象时,垃圾收集器就开始监控对象的地址、大小和使用情况。通常,垃圾收集器通过有向图的方式记录和管理堆中的所有对象。这样就确定了哪些对象“可用”,哪些对象“不可用”。当垃圾收集器确定某些对象“不可用”时,垃圾收集器会回收这些内存空。
但是,垃圾收集器是在system 空的空闲周期中以低优先级执行的。一般来说是低级的,别人不运行才轮到它,所以垃圾收集器慢。有时我们会使用System.gc()。人工回收。以便提高性能。
对于垃圾收集器来说,另一件值得一提的事情是finalize()方法。每个对象都有一个finalize()方法,它继承自Object类。它用于回收系统资源而不是内存,如文件处理器和网络连接器。此方法的调用顺序独立于用于调用此方法的对象的创建顺序。换句话说,编写程序时方法的顺序与方法的实际调用顺序无关。这正是finalize()方法的特点。此外,finalize()方法对于每个对象只能调用一次。如果在执行finalize()方法时生成异常,垃圾收集器仍然可以收集该对象。那是肯定的。不能说用了finalize()。垃圾收集器不会做任何事情。finalize()的工作量很大。
总结:
Java使用垃圾收集器的内存管理方式,并不代表完全好。有时候会影响它的性能,所以我们还是要手动收集。但是像C++那样完全手动收集会太麻烦,也不是很安全。
根据垃圾收集器的工作原理,我们可以使用一些技巧和方法让垃圾收集器更高效的运行。
1.最基本的建议是尽快释放无用对象的引用。
大多数程序员在使用临时变量时,在退出活动范围后会自动将引用变量设置为null。
2.尽可能少使用finalize函数。finalize函数是Java给程序员提供了一个释放对象或资源的机会。但是会增加垃圾收集器的工作量,所以尽量少用finalize方法来回收资源。
3.当程序有一定等待时间时,程序员可以手动执行System.gc()通知垃圾收集器运行,但Java语言规范并不保证垃圾收集器一定会执行。
0条评论