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();