本人在学习到System类的gc()的方法时,写了段代码,但是输出结果我不是很懂,因为每次的输出结果都不同.现将源代码贴于下面.
- public class Demo3_System {
- public static void main(String[] args) {
- new Demo1(); //创建匿名对象,以方便垃圾回收器回收
- new Demo2();
- new Demo3();
- System.gc();
- }
- }
- class Demo1 {
- @Override
- public void finalize() { //这个方法不是手动调用的,当你垃圾产生到一定数量时,虚拟机会自动调用
- System.out.println("Demo1垃圾被回收了");//重写了finalize()方法以测试是否被虚拟机自动调用
- }
-
- }
- class Demo2 {
- @Override
- public void finalize() {
- System.out.println("Demo2垃圾被被回收了");
- }
-
- }
- class Demo3 {
- @Override
- public void finalize() {
- System.out.println("Demo3垃圾被被回收了");
- }
-
- }
复制代码
我运行了三次上面的代码,控制台出现如下的结果:
第一次输出的结果: Demo3垃圾被回收了
第二次输出的结果: Demo1垃圾被回收了
Demo3垃圾被回收了
第三次输出的结果: Demo3垃圾被回收了
Demo2垃圾被回收了
Demo1垃圾被回收了
我看了System.gc()代码的源码是:Runtime.getRuntime().gc().
接着我看了getRuntime()和gc()的源码分别是:public static Runtime getRuntime() {
return currentRuntime;
}
和
public native void gc();
但是我没怎么看懂,我不知是不是这样理解:对于getRuntime()源码:虚拟机会根据当前的时间值去返回一个currentRuntime值,因此每次运行currentRuntime都不同,导致这个值在调用gc()方法时会调用不同对象的finalize()方法? |
|