首页 > 编程 > Java > 正文

java垃圾处理器

2019-11-08 20:19:40
字体:
来源:转载
供稿:网友

但凡对于c++有一定了解的都知道c++有一种方法叫作析构函数,但是与之相比java却没有这种函数,那么java是怎么处理废弃的资源呢?

答案便是我今天要讲的java垃圾处理机制。

0. 但在进入正题之前,需要明确的是,垃圾处理器处理的仅仅是new 出来的对象,至于其他非new出来的对象需要程序员自行处理,因为垃圾回收器不知道如何处理那块内存区域。可能就有人问了,既然java的对象想要生成就必须new出来一个空间,怎么会出现这种状况呢?那是因为我们可能会使用“本地方法”,本地方法指的是在java代码中使用非java代码(如c,c++)。这个时候想要清理着块存储区域就必须用到finalize()方法。

finalize 是根类Object的一个方法,因此适用于所有的java对象,在一个对象需要清理时,垃圾回收器会首先调用其finalize方法,然后在下一次回收之时才会真正清理他。

finalize

PRotected void finalize()                 throws Throwable当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。子类重写 finalize 方法,以配置系统资源或执行其他清除。 

我们可以利用这个特性做一些安全检查,在此就不再赘述。开始步入正题:

1. c++与java对象创建规则的不同之处:

c++ : 可以创建局部对象,该对象将在}结束之时得到清理。可以new创建对象,该对象需要程序员调用delete得到清除。

java:  不能创建局部对象,所有对象必须new出来,清理由垃圾回收器负责。

分析:c++new出来的对象很容易因为程序员的疏忽而造成内存泄漏。

2.java垃圾回收器是怎工作的?

java垃圾回收器采用的是自适应技术:停止-复制,标记-清扫。

再看这两种技术之前,先了解一下java垃圾回收器对其的内存管理。垃圾回收器将堆分为一些块,用于内存管理。

先看看停止-复制:先停止程序的运行,将分布在不同块的小的且零碎的对象复制整理在一个块内。注意大的对象由于独占一个块,所以是不需要复制的。

再说说标记-清扫:从堆栈和静态存储区出发,通过遍历将所有存活的对象打一个标记,清除掉未标记的对象。

分析:标记-清扫会使对象碎片化的分布在不同的块中,这时需要将其整理就需要执行停止-复制。

由此可以简单的推出两种方法的执行时间,当程序产生大量的垃圾时-->停止-复制

    当程序产生少量的垃圾甚至没有垃圾时-->标记-清扫。


上一篇:java文件流

下一篇:java单例模式

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表