随笔 - 0, 文章 - 75, 评论 - 0, 引用 - 0
数据加载中……

java垃圾回收

简单看了一下异常处理的课件,感觉内容还是可以的,不过少了自定义异常的知识,所以决定把自定义异常内容加入进去;当看到finally关键字的时候,想起年轻的时候找工作,经常被问到finally、final、与finalize之间的区别。

finally和final都给介绍了,所以这里简单说一下finalize。

说道finalize这个关键字就要说道java的垃圾回收机制。

在C++处理某实体时,当应用不需要某实体时,就需要调用delete关键字来告诉系统,我不需要这块空间了,对于C++程序员来说,需要手动调用,所以是一个很麻烦很难做的事情,经常会看到一些技术网站昏天暗地地讨论C++内存泄漏的话题,有些时候讨论的激烈了,怕是只要见面就会动手了。

在Java中程序员完全不用考虑实体销毁,也就是只需要考虑实体声明,具体如何销毁实体是JVM要做的工作。

JVM的垃圾回收机制是实时监控堆内存,当发现某些实体没有引用时就会把这些实体放入垃圾回收列表中,但这些放入回收列表中的实体并不是马上被销毁,具体何时被销毁,那就是JVM的垃圾回收算法做的处理了。

但是很多人还是不放心垃圾回收,所以想要自己控制Java的垃圾回收,在这里我要告诉你这是不可能的;但是你可以做一些处理,告诉JVM需要做垃圾回收了,让JVM提前做垃圾回收处理,或者可以说让JVM清理垃圾更容易发生。有两种方法可以实现以上需求,第一种是把堆内存中的引用变量移除,相当于告诉JVM我已经不用这个实体了;第二种是调用System.gc();调用这个方法后同样可以让JVM更容易发生垃圾回收。

那这些和finalize有什么关系呢,在垃圾回收后,会自动调用finalize()方法,注意,这个方法是Object中的方法,所以任何实体类都可以调用这个方法,finalize()方法被称作是垃圾回收的善后方法。看如下例子。


public
class T2 {

private String
name;


public String getName()
{
  return name;

}

public void setName(String name)
{
  this.name =
name;
}

public T2(String name)
{
  this.name =
name;
}

public
static void main(String[] args){
 
for(int i = 0 ; i< 100; i++){
 
new T2("T"+i);
 
}
 
System.gc();//让JVM更容易发生垃圾回收
}

//重写垃圾回收善后的方法
public void
finalize(){
 
System.out.println(this.getName());

}
}

运行时会看到效果,如果去掉System.gc();这句话,几乎看不到任何效果

通过垃圾回收是不是对finalize有了进一步的了解?

posted on 2012-04-22 15:15 hantai 阅读(125) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航: