zoukankan      html  css  js  c++  java
  • 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()方法出现异常时,不会报异常,会继续执行程序

     

  • 相关阅读:
    poj 2533 (LIS 最长递增子序列)
    zoj 2432(最长递增上升子序列)
    hdu 1159(最长公共子序列)
    2013 腾讯马拉松初赛 第1场
    poj 1458(最长公共子序列)
    hdu 4524(水题)
    hdu 4514(自己添加栈—— #pragma comment(linker, "/STACK:102400000,102400000" ))
    MVC3安装报错解决方案
    C# 用7Z 压缩 ZIP
    获得字符串中开始和结束字符串中间得值
  • 原文地址:https://www.cnblogs.com/lili-work/p/9405817.html
Copyright © 2011-2022 走看看