A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

barcelona

中级黑马

  • 黑马币:81

  • 帖子:29

  • 精华:0

本人在学习到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()方法?

7 个回复

正序浏览
小麦芽 发表于 2017-3-27 15:17
首先runtime不是表示运行时间,只是一种状态,“运行时“的状态(当前有很多条线程运行,就出现了当前运行 ...

意思就是说会根据当前执行的是什么线程去执行垃圾回收机制?
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
{:8_497:}{:8_497:}{:8_497:}
回复 使用道具 举报
首先runtime不是表示运行时间,只是一种状态,“运行时“的状态(当前有很多条线程运行,就出现了当前运行时线程),gc其实到最后走的是C代码去执行垃圾回收机制的,
回复 使用道具 举报
gsong1 发表于 2017-3-26 18:33
调用了finalize() ,只是告诉了释放资源,回收机制呢不一定执行,所以不一样啊 ...

那这个回收机制是怎样的呢?与什么有关?
回复 使用道具 举报
调用了finalize() ,只是告诉了释放资源,回收机制呢不一定执行,所以不一样啊
回复 使用道具 举报
zhao543 发表于 2017-3-24 18:25
0000000000000000000000000000000000000000

老哥你发的啥啊?求解决问题啊
回复 使用道具 举报
0000000000000000000000000000000000000000
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马