1、垃圾回收
(1)哪些对象会被gc回收
设置对象为null
Employee e=new Employee();
e=null;
无引用对象
Employee e1=new Employee();
Employee e2=new Employee();
e1=e2;//now the first object referred by e1 is available for garbage collection
游离对象
new Employee();
(2)gc只能清理new关键字创建的对象
(3)finalize(object方法)在对象被gc之前调用,可以用来清理非new建立的对象,例如非托管资源数据库连接(Connection),也可以清理new关键字创建的对象
2、线程
1、线程状态:创建——启动——运行——休眠——终止
2、线程优先级:MIN_PRIORITY=1,MAX_PRIORITY=10,NORM_PRIORITY=5(默认)
3、守护线程(Daemon thread):优先级低,为User threads提供服务,例如gc、finalize等,当所有user thread结束后,JVM自动终止守护线程
3、JVM
1、终止JVM:System.exit(0);内部实际上调用Runtime.getRuntime().exit(0);
2、shutdown hook:当JVM正常或非正常退出时,会执行shutdown hook,可以作清理资源用(使用示例:Runtime.getRuntime().addShutdownHook(new HookThread());)
3、显式gc:System.gc();内部实际上调用Runtime.getRuntime.gc();
4、代码测试
public class TestGarbage {
// 在对象被回收之前调用,可以用来清理托管资源(new关键字创建)和非托管资源(例如connection),尤其是非托管资源?
public void finalize(){
System.out.println("call the methods complete");
}
public static void main(String[] args){
TestGarbage test1 = new TestGarbage();
TestGarbage test2 = new TestGarbage();
test1 = null; // 标记此对象可以被垃圾回收器回收
test2 = null; // 注意gc只回收通过new创建的对象
System.gc(); // 显式触发gc,内部调用Runtime.getRuntime().gc();
try {
Thread.sleep(10000); // 但是不确定什么时候调用test1/test2的finalize方法,因此下面sleep一会才可以看到调用过程
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}