zoukankan      html  css  js  c++  java
  • Java清除:收尾和垃圾收集

    垃圾收收集器(GC)只知道释放由new关键字分配的内存,所以不知道如何释放对象的“特殊”内存。为了解决这个问题,Java提供了一个名为:finalize()的方法,可为我们的类定义它。

    理想情况下finalize()方法的工作原理是这样:一旦CG准备好释放对象占用的内存空间,它首先调用finalize()方法,而且只有在下一次的垃圾收集过程中,才会真正回收对象的内存。

    GC != Destructor,垃圾收集器并不等于破坏器。

    为强制进行收尾工作(执行除释放对象存储空间之外的其它某种形式的清除工作),可先调用System.gc(),再调用System.runFinalization()这样可清除到目前为止没有使用的所有对象。这样做一个稍显奇怪的地方是在调用runFinalization()之前调用gc(),这看起来似乎与Sun公司的文档说明有些抵触,它宣称首先运行收尾模块,再释放存储空间。然而,若在这里首先调用runFinalization(),再调用gc(),收尾模块根本不会执行。

    针对所有对象,Java1.1有时之所以会默认为跳过收尾工作,是由于它认为这样做的开销太大。不管用哪种方法强制进行垃圾收集,都可能注意到比没有额外收尾工作时较长的时间延迟

    finalize()最有用处的地方之一是观察垃圾收集的过程

    public class Garbage {
        public static void main(String[] args) {
    
            while (!Chair.f) {
                new Chair();
                new String("To take up space");
            }
    
            System.out.println("After all Chairs have been created:
    " + "total created = " + Chair.created + ", total finalized = " + Chair.finalized);
    
            System.out.println("gc():");
            System.gc();
            System.out.println("runFinalization():");
            System.runFinalization();
    
            System.out.println("bye!");
        }
    }
    
    public class Chair {
        static boolean gcrun = false;
        static boolean f = false;
        static int created = 0;
        static int finalized = 0;
        int i;
    
        public Chair() {
            i = ++created;
            if (created == 47){
                System.out.println("Created 47");
            }
        }
    
        protected void finalize(){
            if (!gcrun){
                gcrun = true;
                System.out.println("Beginning to finalize after chairs been created.");
                System.out.println("i=" + i);
                System.out.println("created=" + created);
            }
            if (i == 47){
                System.out.println("Finalize chair #47,setting flag to stop chair creation.");
                f = true;
            }
            finalized++;
            if (finalized >= created){
                System.out.println("All finalized.");
            }
        }
    }
  • 相关阅读:
    java中值传递和引用传递
    java中的XML
    java I/O流
    RandomAccessFile类
    java中File类
    Java 理论与实践: 正确使用 Volatile 变量
    eclipse 总弹出 secure storage的解决办法
    安卓表格布局android:collapseColumns,android:shrinkColumns和stretchColumn
    Android关联源码support-v4的问题解决
    关于spring framework最新发布压缩包的下载问题 【非常非常新手帖】
  • 原文地址:https://www.cnblogs.com/frankyou/p/5980339.html
Copyright © 2011-2022 走看看