JAVA基础类库--System

System类

1、可用System.arraycopy()实现数组拷贝,该方法的定义如下:

public static void arraycopy(Object src, int srcPos, Object dest,int destPos, int length)

2、 在System类中定义有一个方法,用于取得当前系统时间,其定义如下:public static long currentTimeMillis();

范例:统计某项操作的执行时间

public class Demo {
    public static void main(String[] args) throws Exception {
        long start = System.currentTimeMillis(); // 取得开始时间
        String str = "";
        for (int x = 0; x < 3000; x++) {
            str += x;
        }
        long end = System.currentTimeMillis(); // 取得结束时间
        System.out.println("循环所使用的时间:" + (end - start) + " ms");
    }
}

要想统计出所花费的毫秒时间,用long型数据直接进行数学计算即可。

3、在System类中定义了一个方法:public static void gc(),该方法是间接调用Runtime类中的gc()。对象产生会调用类中的构造方法,可以进行一些处理操作。但是对象被回收时,却什么都做不了。

class Member {
    public Member() {
        System.out.println("对象产生了!");
    }
}

public class Demo {
    public static void main(String[] args) {
        Member member = new Member(); // 对象产生时可以进行一些操作
        member = null; // 对象被回收时,无法进行其他操作
    }
}

如果要在销毁对象时,给对象增添一些操作,可以覆写Object类中的finalize()其定义:protected void finalize() throws Throwable。对象回收时,就算抛出了异常,也不会影响程序的正常执行。

范例:对象收尾

class Member{
    public Member() {
       System.out.println("对象诞生了");
    }

    @Override
    protected void finalize() throws Throwable {
        System.out.println("对象被销毁了");
        throw new Exception("对象还会再产生的");
    }
}

public class Demo {
    public static void main(String[] args) throws Exception {
        Member member = new Member();
        member = null; 
        System.gc(); // 手工处理垃圾收集
    }
}

构造方法是对象初始化时调用的,而finalize()是回收对象前调用的。

final、finally和finalize的区别

final:是一个关键字,用于定义不能被继承的类,不能被覆写的方法和常量;

finally:是一个关键字,异常的统一出口;

finalize:是一个Object类的方法(protected void finalize() throws Throwable),是对象回收前调用的方法,即使出现异常也不会导致程序中断。

附录: System.gc()被调用后,其实并不会立即进行垃圾回收,甚至不一定会进行垃圾回收。通过查看gc方法源码可得出该结论。

public static void gc() {
    boolean shouldRunGC;
    synchronized(lock) {
        shouldRunGC = justRanFinalization;
        if (shouldRunGC) {
            justRanFinalization = false;
        } else {
            runGC = true;
        }
    }
    if (shouldRunGC) {
        Runtime.getRuntime().gc();
    }
}

只有当justRanFinalization=true时才会执行gc操作。即,我们直接调用System.gc()时只是把本次请求记录,直到justRanFinalization=true时才会进行一次gc操作。
而想要justRanFinalization=true需要调用System.runFinalization()

public static void runFinalization() {
        boolean shouldRunGC;
        synchronized(lock) {
            shouldRunGC = runGC;
            runGC = false;
        }
        if (shouldRunGC) {
            Runtime.getRuntime().gc();
        }
        Runtime.getRuntime().runFinalization();
        synchronized(lock) {
            justRanFinalization = true;
        }
}

因此想要立即进行gc操作,代码中可按照下述方式

System.gc();
runtime.runFinalizationSync();
System.gc();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值