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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Rancho_Gump 高级黑马   /  2013-1-29 19:13  /  1191 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张向辉 于 2013-2-2 12:29 编辑

  1. import java.io.IOException;

  2. public class GarbageTest {

  3. /**
  4. * @param args
  5. * @throws IOException
  6. */
  7. public static void main(String[] args) throws IOException {
  8. // TODO Auto-generated method stub
  9. try {
  10. gcTest();
  11. } catch (IOException e) {
  12. // TODO Auto-generated catch block
  13. e.printStackTrace();
  14. }
  15. System.out.println("has exited gcTest!");
  16. System.in.read();
  17. System.in.read();
  18. System.out.println("out begin gc!");
  19. for(int i=0;i<100;i++)
  20. {
  21. System.gc();
  22. System.in.read();
  23. System.in.read();
  24. }
  25. }

  26. private static void gcTest() throws IOException {
  27. System.in.read();
  28. System.in.read();
  29. Person p1 = new Person();
  30. System.in.read();
  31. System.in.read();
  32. Person p2 = new Person();
  33. p1.setMate(p2);
  34. p2.setMate(p1);
  35. System.out.println("before exit gctest!");
  36. System.in.read();
  37. System.in.read();
  38. System.gc();
  39. System.out.println("exit gctest!");
  40. }

  41. private static class Person
  42. {
  43. byte[] data = new byte[20000000];
  44. Person mate = null;
  45. public void setMate(Person other)
  46. {
  47. mate = other;
  48. }
  49. }
  50. }
复制代码
这个程序是为了证明:有两个对象,相互引用,只要它们和根进程不可达的,那GC也是可以回收它们的。
但这个程序不是很理解  System.in.read();  起到什么作用呢?

3 个回复

倒序浏览
对于这段代码看起来很麻烦,但是我知道System.in.read()这句是什么意思.
System.in是标准输入流,也就是DOS命令行了.而上面这句话就是从命令行读取一个字节的数据,这个方法是阻塞的!
回复 使用道具 举报
本帖最后由 黄鸿达 于 2013-1-30 15:10 编辑

这套题我想了半天,虽然知道system.in.read是让你输入数据,并且通过多段的输入动作来了解程序的运行进度。这套题目是用来证明2个对象互相引用,垃圾回收机制可以通过可达性分析来判定对象是否存活的 。但是你问的是system.in.read这个起什么作用,我当然就想回答“并且通过多段的输入动作来了解程序的运行进度”。但是同时我又想,我怎么知道你这个垃圾回收机制真的运行了?百度了一下,找不到我想要的理想答案,内存泄露就是一些无用的数据占用内存。我想了想,只要程序没结束前,有看到本来的对象所占用内存减少了,就代表GC执行成功了。

图截得不好,有兴趣自己运行一下,因为自己电脑也有别的程序,内存的可用数也不稳定。

但是程序的运行就是,输入数据,直到程序建立对象,再输入输入,触发垃圾回收机制,再输入输入,等待回收,基本输入34次就回收了,之后再输入输入程序结束。
更多图片 小图 大图
组图打开中,请稍候......

评分

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

查看全部评分

回复 使用道具 举报

对于这段代码看起来很麻烦,但是我知道System.in.read()这句是什么意思.
System.in是标准输入流,是获取键盘输入的一个字节
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马