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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 丁岩 中级黑马   /  2013-5-14 14:43  /  1297 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 丁岩 于 2013-5-18 15:15 编辑

关于Java的垃圾回收机制,我有幸看到了这样的一段代码,但是看的不是很懂。。。有没有大神帮我解读一下这个代码的思路过程啊?
  1. class Thrs1
  2. {
  3.    static boolean gcrun = false;
  4.    static boolean f = false;
  5.    static int created = 0;
  6.    static int finalized = 0;
  7.    int i;
  8.   Thrs1()
  9.   {
  10.    i = ++created;
  11.    if(created == 47)
  12.    System.out.println("Created 47");
  13.    }
  14.    protected void finalize() {
  15.    if(!gcrun)
  16.    {
  17.      gcrun = true;
  18.      System.out.println(
  19.      "Beginning to finalize after " +
  20.       created + " Chairs have been created");
  21.     }
  22.    if(i == 47) {
  23.    System.out.println(
  24.    "Finalizing Chair #47, " +
  25.    "Setting flag to stop Chair creation");
  26.     f = true;
  27.     }
  28.      finalized++;
  29.     if(finalized >= created)
  30.     System.out.println("All " + finalized + " finalized");
  31.     }
  32. }
  33. public class Thrs {
  34. public static void main(String[] args) {

  35. if(args.length == 0) {
  36. System.err.println("Usage: \n" +
  37. "java Garbage before\n or:\n" +
  38. "java Garbage after");
  39. return;
  40. }
  41. while(!Thrs1.f) {
  42. new Thrs1();
  43. new String("To take up space");
  44. }
  45. System.out.println(
  46. "After all Chairs have been created:\n" +
  47. "total created = " + Thrs1.created +
  48. ", total finalized = " + Thrs1.finalized);
  49. if(args[0].equals("before")) {
  50. System.out.println("gc():");
  51. System.gc();
  52. System.out.println("runFinalization():");
  53. System.runFinalization();
  54. }
  55. System.out.println("bye!");
  56. if(args[0].equals("after"))
  57. System.runFinalizersOnExit(true);
  58. }
  59. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

3 个回复

倒序浏览
本帖最后由 xuemeng 于 2013-5-14 19:15 编辑

  我给来段简单的代码吧, 这代码也能说明问题, 比你的代码简单多了!!!
class Demo {
        public static void main(String[] args) throws Exception {
                // 当for循环次数太多, 也就是说产生的垃圾太多, 把下面的调用垃圾回收器的代码注释掉, 也可以看到垃圾回收器会执行
                // 这就说明垃圾回收器即使不掉用, 在垃圾漫天飞的时候会出来工作.
                for (int i = 0; i < 100000; i++) {
                        // 产生垃圾
                        new A(i);
                }
                // 调用垃圾回收器
                // System.gc();
                // 这里调用sleep方法的目的, 这里的目的是让主线程不要马上结束, 步然垃圾回收器线程没有执行时, 程序就结束了;
                // Thread.sleep(100);

        }
}

class A {
        private int i;

        public A(int i) {
                this.i = i;
        }

        // 这里复写了Object的finalize方法,目的是让看到垃圾回收器有没有工作
        public void finalize() {
                System.out.println(i);
        }
}

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
如果问题未解决,请继续追问,如果问题解决了,请点击你的帖子下面的"编辑"重新编辑帖子,将分类改为“已解决”,谢谢合作!
回复 使用道具 举报
如果问题已经解决了,那么大家请把帖子的类型改为“已解决”,在自己帖子的左下角点编辑,然后选择帖子的分类进行改正。{:soso_e163:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马