java 对象与垃圾回收

C语言要求程序员显示的分配内存,释放内存

java语言不要求程序员分配内存和释放内存,避免很多潜在的问题。java在创建对象时自动分配内存,并当该对象的引用不存在时释放这块内存

回收机制有如下特点:

  • 只负责回收堆内存中的对象,不负责回收物理资源,例如数据库连接
  • 程序无法控制垃圾回收什么时候进行,它会在合适的时候进行
  • 回收任何对象之前先调用finalize()方法,能够使对象恢复,让一个引用变量引用该对象,

对象在内存中的三种状态:

  • 可达状态:对象创建之后,有一个或者多个引用变量指向改对象,可以通过这些引用变量调用该对象的实例变量和实例方法
  • 可恢复状态:程序中某个对象没有引用变量,为可恢复状态,在这个状态下,系统的垃圾回收机制准备回收该对象所占内存,回收之前会调用finalize()方法,如果系统在调用此方法时能够让一个引用变量重新引用该对象,则进入可达状态,否则进入不可达状态。
  • 不可达状态:当对象与其他任何引用变量没有关联,且已经执行了finalize()方法仍然没有进入可达状态,则永久性的失去引用。只有是不可达状态的对象才能被回收

强制垃圾回收:

程序只能控制一个对象何时不再被任何引用变量引用,但是不能控制何时被回收

强制系统进行垃圾回收——只是通知系统进行垃圾回收

强制垃圾回收有两种方式:

System.gc()

RunTime.getRunTime().gc()

public class test1 {
    public static void main(String[] args) {    
        for(int i=0;i<10;i++){
            new test1();
        }
    }
    @Override
    protected void finalize() throws Throwable {
        // TODO Auto-generated method stub
        System.out.println("调用finalize");
    }
}

运行上面代码,没有任何输出,系统并没有调用finalize()

public class test1 {
    public static void main(String[] args) {    
        for(int i=0;i<10;i++){
            new test1();
            //System.gc();
            Runtime.getRuntime().gc();
        }
    }
    @Override
    protected void finalize() throws Throwable {
        // TODO Auto-generated method stub
        System.out.println("调用finalize");
    }
}
加上 //System.gc(); Runtime.getRuntime().gc();任何一句会调用finalize(),但是只是建议回收机制回收,可能不会立即回收

finalize()方法:

在垃圾回收机制准备回收某对象所占用内存之前会先清理资源,如果没有明确指定回收资源的情况下,java会提供默认清理该对象资源的机制,为finalize()方法

任何object类都可以重写finalize()方法

垃圾回收机制调用该对象的finalize()是透明的,不能明确什么时候会调用,只有在程序认为需要更多额外内存,垃圾回收机制才会进行垃圾回收

finalize()有如下四个特点:

  • 不会主动调用某个对象的finalize()方法,交给回收机制进行调用
  • finalize()是否会被调用,何时调用,是不确定的,不是一个一定会执行的方法
  • 当JVM执行finalize()方法时,可能会使该对象及程序中的其他对象重新回到可达状态
  • 当JVM执行finalize()方法出现异常时,不会报异常,会继续执行程序

 

原文地址:https://www.cnblogs.com/lili-work/p/9405817.html