黑马程序员技术交流社区

标题: 关于System类的gc()方法的一些问题 [打印本页]

作者: barcelona    时间: 2017-3-24 11:31
标题: 关于System类的gc()方法的一些问题
本人在学习到System类的gc()的方法时,写了段代码,但是输出结果我不是很懂,因为每次的输出结果都不同.现将源代码贴于下面.

  1. public class Demo3_System {
  2.                 public static void main(String[] args) {
  3.                         new Demo1();  //创建匿名对象,以方便垃圾回收器回收
  4.                         new Demo2();
  5.                         new Demo3();
  6.                         System.gc();

  7.         }
  8. }

  9. class Demo1 {

  10.         @Override
  11.         public void finalize() {      //这个方法不是手动调用的,当你垃圾产生到一定数量时,虚拟机会自动调用
  12.                 System.out.println("Demo1垃圾被回收了");//重写了finalize()方法以测试是否被虚拟机自动调用
  13.         }
  14.        
  15. }

  16. class Demo2 {

  17.         @Override
  18.         public void finalize() {
  19.                 System.out.println("Demo2垃圾被被回收了");
  20.         }
  21.        
  22. }

  23. class Demo3 {

  24.         @Override
  25.         public void finalize() {
  26.                 System.out.println("Demo3垃圾被被回收了");
  27.         }
  28.        
  29. }
复制代码


我运行了三次上面的代码,控制台出现如下的结果:
第一次输出的结果: 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()方法?
作者: zhao543    时间: 2017-3-24 18:25
0000000000000000000000000000000000000000
作者: barcelona    时间: 2017-3-25 11:52
zhao543 发表于 2017-3-24 18:25
0000000000000000000000000000000000000000

老哥你发的啥啊?求解决问题啊
作者: gsong1    时间: 2017-3-26 18:33
调用了finalize() ,只是告诉了释放资源,回收机制呢不一定执行,所以不一样啊
作者: barcelona    时间: 2017-3-26 21:58
gsong1 发表于 2017-3-26 18:33
调用了finalize() ,只是告诉了释放资源,回收机制呢不一定执行,所以不一样啊 ...

那这个回收机制是怎样的呢?与什么有关?
作者: 小麦芽    时间: 2017-3-27 15:17
首先runtime不是表示运行时间,只是一种状态,“运行时“的状态(当前有很多条线程运行,就出现了当前运行时线程),gc其实到最后走的是C代码去执行垃圾回收机制的,
作者: yangxiaosa    时间: 2017-3-27 16:11
{:8_497:}{:8_497:}{:8_497:}
作者: barcelona    时间: 2017-3-29 10:37
小麦芽 发表于 2017-3-27 15:17
首先runtime不是表示运行时间,只是一种状态,“运行时“的状态(当前有很多条线程运行,就出现了当前运行 ...

意思就是说会根据当前执行的是什么线程去执行垃圾回收机制?





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2