当前位置:  技术问答>java相关

关于构造器和垃圾回收器

    来源: 互联网  发布时间:2015-02-12

    本文导语:  有这样一个类: cclass Chair {   static boolean gcrun = false;   static boolean f = false;   static int created = 0;   static int finalized = 0; Chair() {     ++created;     }   public void finalize() {     if(!gcrun) {       /...

有这样一个类:
cclass Chair {
  static boolean gcrun = false;
  static boolean f = false;
  static int created = 0;
  static int finalized = 0;

Chair() {
    ++created;
    }
  public void finalize() {
    if(!gcrun) {
      // The first time finalize() is called:
      gcrun = true;
      System.out.println(
        "Beginning to finalize after " +
        created + " Chairs have been created");
    }
    finalized++;
    if(finalized >= created){
      f=true;
      System.out.println(
        "All " + finalized + " finalized");
  }
}
}
我使用这个类时,

  public class Garbage {
  public static void main(String[] args) {
    // As long as the flag hasn't been set,
    // make Chairs and Strings:

    while(!Chair.f) {
      new Chair();
      new String("To take up space");
    }
}
发现创建2907个对象的时候(即created=2907时),就开始调用垃圾回收器;
但是如果再开始用相同的方法创建对像时(见下面程序):

public class Garbage {
  public static void main(String[] args) {
    // As long as the flag hasn't been set,
    // make Chairs and Strings:

    while(!Chair.f) {
      new Chair();
      new String("To take up space");
    }


Chair.gcrun = false;
Chair.f = false;
Chair.created = 0;
Chair.finalized = 0;

while(!Chair.f) {    //第2次使用相同的方法创建对象
      new Chair();
      new String("To take up space");
    }

}
}
当创建了4354个对象(即created=4354),才调用垃圾回收器。这是为什么呀?java根据什么来确定多久回收对象?

|
在Java语言中,判断一块内存空间是否符合垃圾收集器收集标准的标准只有两个: 
1.给对象赋予了空值null,以下再没有调用过。 
2.给对象赋予了新值,既重新分配了内存空间。 
如;
程序段1: 
1.fobj = new Object ( ) ; 
2.fobj. Method ( ) ; 
3.fobj = new Object ( ) ; 
4.fobj. Method ( ) ; 
问:这段代码中,第几行的fobj 符合垃圾收集器的收集标准? 
答:第3行。因为第3行的fobj被赋了新值,产生了一个新的对象,即换了一块新的内存空间,也相当于为第1行中的fobj赋了null值。 
程序段2: 
1.Object sobj = new Object ( ) ; 
2.Object sobj = null ; 
3.Object sobj = new Object ( ) ; 
4.sobj = new Object ( ) ; 
问:这段代码中,第几行的内存空间符合垃圾收集器的收集标准? 
答:第1行和第3行。因为第2行为sobj赋值为null,所以在此第1行的sobj符合垃圾收集器的收集标准。而第4行相当于为sobj赋值为null,所以在此第3行的sobj也符合垃圾收集器的收集标准。 


|
是的!
要知道,垃圾收集是一个线程,而且为了不影响程序效率,优先级是很低的
符合垃圾收集的条件的对象,也要等到垃圾收集线程取得控制权之后才会被收集掉,比如你放到门口的垃圾袋也一般要放上一天才会被收集掉

|
Java的语言说明只定义了回收规则时系统可以回收该对象,但并未定义是否立即回收;而实际上Java也不是立即回收的,这可以在很多地方查到的。

    
 
 

您可能感兴趣的文章:

  • C++ I/O 成员 Constructors:构造器
  • c# 引用类型构造器
  • java类构造器的调用时机?
  • c# 值类型实例构造器
  • 有关构造器和方法的问题
  • 谁愿意给我讲讲构造器的用途,谢谢!
  • jQuery的Widget构造器 Fluqi
  • 有关构造器的问题??
  • 请问什么是JAVA的构造器。
  • 构造器也可以带public吗?volatile怎么用?
  • 非静态初始化模块和构造器的区别?
  • 构造器的内容
  • struct 也有构造器吗?
  • 使所有实现此接口(interface)的类拥有相同的构造器(contructor)?
  • 请问私有的构造器有何意义,即适用于什么样的场合?
  • c# 类型构造器
  • 构造器问题
  • 关于传递参数到匿名类的构造器的问题
  • c# 类型构造器学习
  • 定义了构造器的类不能被继承吗?谢谢!
  • 奇怪,为什么BufferedInputStream的构造器参数是(InputStream in)和(InputStream in,int size)啊?InputStream是抽象类,怎么能被实例化呢?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 关于超类构造器的问题
  • 设计构造器与一般方法的访问控制问题!
  • [oo问题大讨论] 关于构造器调用的怪题!
  • Java基础教程之构造器与方法重载


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3