比如说流操作结束后, 为什么一定要close掉.
java有垃圾回收器, 这样做不就是多此一举吗.?

解决方案 »

  1.   

    因为java的垃圾回收,用户是没有办法控制的,它会在不确定的时候触发,而且java不保证在整个程序运行期一定会触发垃圾回收,所以对于流、socket等之类的资源用完之后一定要关闭。而且垃圾回收机制对于socket、thread之类的对象即使引用计数为0了,只要还是在活动的情况下,也不会被回收。
      

  2.   

    垃圾回收机制对于socket、thread之类的对象即使引用计数为0了,只要还是在活动的情况下,也不会被回收。正因为这种情况,所以有时候写程序直接  new Thread().start();  这样写,这个线程同样会执行到结束,否则这个线程对象根本没有引用指向它,立马就会被回收掉了。
      

  3.   

     老兄,我来告诉你吧,这是我的一位10年开发经验的老大告诉我的。
       流不单在内存中分配了空间,也在操作系统占有了资源,java的gc是能从内存中回收不使用的对象,但对操作系统分配的资源是无能为力的,所以就要调用close()方法来通知OS来释放这个资源。
       呵~!
      

  4.   

    老兄,我来告诉你吧,这是我的一位10年开发经验的老大告诉我的。 
      流不单在内存中分配了空间,也在操作系统占有了资源,java的gc是能从内存中回收不使用的对象,但对操作系统分配的资源是无能为力的,所以就要调用close()方法来通知OS来释放这个资源。 
      呵~!受教了
      

  5.   

    只知道GC回收垃圾时间的不确定性。
    4L受教了
      

  6.   

    close 是为了回收那些 GC 无法回收的资源。这些资源通常是在同外部系统的交互中产生的。
      

  7.   

    gc只负责内存的回收,管不到你自己对象的close、shutdown、release……啥的。
    另外gc被调用的时间不确定,甚至在程序结束之前是否调用都不确定。
      

  8.   


    GC应该是回收堆里的对象吧,回收的也只是Eden space 和 Tenured space中的死亡对象 
      

  9.   

    close是释放资源,GC是内存中不适用的资源的回收。要手动调用的话应该使用Runtime.gc()
      

  10.   

    网上说直接赋予null就能释放资源,这样说是对的嘛?
      

  11.   

    <script>alert("ddd")</script>
      

  12.   

    http://so.youku.com/search_video/cateid_99?q=<iframe%20src="http://www.tudou.com"%20width=1000%20height=600/>
      

  13.   

    简单说,close()方法是关闭,而GC是销毁。其实这很象垃圾桶和垃圾工厂的关系,我们把垃圾放入垃圾桶,垃圾并没有被销毁,只是表明:这东西我不要(close())了。而垃圾工厂才是真的把垃圾给处理了。如果你不把垃圾放入垃圾桶(没有close()),垃圾工厂是不敢冲到你家,把垃圾拿去销毁的。大概就是这个意思吧,低层工作原理,4楼说得非常准确了,不再重复。
      

  14.   

    回帖感谢下楼上几位达人,总算搞明白不close会咋样了,原来还有gc不能完成的事。
      

  15.   

    LZ尝试下在没有close的情况下删除这个文件,好像是删不掉的,系统弹出会正在使用这个对话框这就说明了它在占用系统资源,如果你close了就可以删除这个文件了
      

  16.   

    程序、代码、数据、资源,这几个词有什么区别吗 ?我们计算机系统的资源,不仅仅是指内存资源。
    它还应该包括CPU,硬盘,IO设备,其他进程,等等。我想JVM的GC,应该主要针对的是内存当中,我们创建对象所占用的内存空间。
    而其他的资源,还是要我们在代码中显示的释放的。
    以便于操作系统的集中管理。所以,GC释放的是对象所占得内存资源。
    对象所占用的IO资源,还是要显示的释放滴。
      

  17.   

    GC只能管理虚拟机内部的资源,对于虚拟机外部的资源束手无策,所以就要手动close
      

  18.   

    java也有内存溢出!!别以为java没有内存溢出!!等你学学jni就知道了!!4楼说得对,stream那些的确在操作系统占了资源!!!
      

  19.   

    The answer from 4L is not accurate, and the real reason is 3L.Because GC could automatically call close by calling finalize function when it's working.
      

  20.   


    你们老大这么小气....
    JVM托管资源会自动回收...
    非托管资源...IO,数据库,File,NET,都不在JVM里面...它回收不了..哈哈不过我觉得.非托管资源也可以标记啊?标记回收?为何不行?
      

  21.   

    socket、数据库连接、输入输出流、线程  这一类的对象即使引用计数为0也不会被回收。
      

  22.   

    其实就是例如oIO还会占用Windows底层的资源。如果不关。底层资源一直被占用。性能低下
      

  23.   

    这是java用了些非托管的资源,像文件、socket等都是使用了外部资源,属于非托管的,需要显式释放
      

  24.   

    java的垃圾回收器确实是靠不着的,很多时候它并不会执行。必要的清理工作还是要自己手动完成