黑马程序员技术交流社区

标题: 关于内存泄露 [打印本页]

作者: Rancho_Gump    时间: 2013-1-29 19:13
标题: 关于内存泄露
本帖最后由 张向辉 于 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();  起到什么作用呢?

作者: 杨玲    时间: 2013-1-29 23:16
对于这段代码看起来很麻烦,但是我知道System.in.read()这句是什么意思.
System.in是标准输入流,也就是DOS命令行了.而上面这句话就是从命令行读取一个字节的数据,这个方法是阻塞的!
作者: 黄鸿达    时间: 2013-1-30 15:01
本帖最后由 黄鸿达 于 2013-1-30 15:10 编辑

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

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

但是程序的运行就是,输入数据,直到程序建立对象,再输入输入,触发垃圾回收机制,再输入输入,等待回收,基本输入34次就回收了,之后再输入输入程序结束。

1.JPG (215.41 KB, 下载次数: 9)

红字,程序没开始的内存

红字,程序没开始的内存

2.JPG (213.95 KB, 下载次数: 9)

开始,并输入点数据创建里对象,由于对象创建了很大的数组占用了许多内存 ... ...

开始,并输入点数据创建里对象,由于对象创建了很大的数组占用了许多内存 ... ...

3.JPG (225.77 KB, 下载次数: 10)

间断输入数据,令程序进行,下面打印语句显示类似GC已经启动了的英文打印语句,同时发现内存被释放了,但是 ...

间断输入数据,令程序进行,下面打印语句显示类似GC已经启动了的英文打印语句,同时发现内存被释放了,但是 ...

4.JPG (233.19 KB, 下载次数: 15)

程序运行完毕

程序运行完毕

作者: 铿锵科技    时间: 2013-1-31 14:01

对于这段代码看起来很麻烦,但是我知道System.in.read()这句是什么意思.
System.in是标准输入流,是获取键盘输入的一个字节




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