但凡对于c++有一定了解的都知道c++有一种方法叫作析构函数,但是与之相比java却没有这种函数,那么java是怎么处理废弃的资源呢?
答案便是我今天要讲的java垃圾处理机制。
0. 但在进入正题之前,需要明确的是,垃圾处理器处理的仅仅是new 出来的对象,至于其他非new出来的对象需要程序员自行处理,因为垃圾回收器不知道如何处理那块内存区域。可能就有人问了,既然java的对象想要生成就必须new出来一个空间,怎么会出现这种状况呢?那是因为我们可能会使用“本地方法”,本地方法指的是在java代码中使用非java代码(如c,c++)。这个时候想要清理着块存储区域就必须用到finalize()方法。
finalize 是根类Object的一个方法,因此适用于所有的java对象,在一个对象需要清理时,垃圾回收器会首先调用其finalize方法,然后在下一次回收之时才会真正清理他。
PRotected void finalize() throws Throwable当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。子类重写finalize方法,以配置系统资源或执行其他清除。我们可以利用这个特性做一些安全检查,在此就不再赘述。开始步入正题:
1. c++与java对象创建规则的不同之处:
c++ : 可以创建局部对象,该对象将在}结束之时得到清理。可以new创建对象,该对象需要程序员调用delete得到清除。
java: 不能创建局部对象,所有对象必须new出来,清理由垃圾回收器负责。
分析:c++new出来的对象很容易因为程序员的疏忽而造成内存泄漏。
2.java垃圾回收器是怎工作的?
java垃圾回收器采用的是自适应技术:停止-复制,标记-清扫。
再看这两种技术之前,先了解一下java垃圾回收器对其的内存管理。垃圾回收器将堆分为一些块,用于内存管理。
先看看停止-复制:先停止程序的运行,将分布在不同块的小的且零碎的对象复制整理在一个块内。注意大的对象由于独占一个块,所以是不需要复制的。
再说说标记-清扫:从堆栈和静态存储区出发,通过遍历将所有存活的对象打一个标记,清除掉未标记的对象。
分析:标记-清扫会使对象碎片化的分布在不同的块中,这时需要将其整理就需要执行停止-复制。
由此可以简单的推出两种方法的执行时间,当程序产生大量的垃圾时-->停止-复制
当程序产生少量的垃圾甚至没有垃圾时-->标记-清扫。
新闻热点
疑难解答