void abc() {FileInputStream fin = new FileInputStream(strPathName);
}

解决方案 »

  1.   

    一般使用
    FileInputStream fin = new FileInputStream(strPathName);
    的时候,最后不是应该
    fin.close();的吗?
      

  2.   

    FileInputStream fin = new FileInputStream(strPathName); 
    按照 java 的说法 就是  local object ,会自动被 垃圾收集器 保持,当没有对象引用 就自动释放
      

  3.   

    肯定会啊,这个JVM不会自动close的。
      

  4.   

    这是不是跟JAVA的内存回收机制有关系啊?我记得以前听说过,如果没人引用的话,过一阵子JAVA内存回收就会把它放掉的。
      

  5.   

    好吧  我这只菜鸟 wuhuakejiang
      

  6.   

    必须close 否则你懂的 回收对象是空引用就被回收
    这个引用空了 被回收了
    但是打开的流 还是开启状态  必须手动close 
    当我们在程序中创建一个IO流对象的时候,同时系统也会创建
    一个叫做流的东西,在这种情况下,计算机内存中实际产生了两个事物,一个是java程
    序中类的实例对象,一个是系统本身产生的某种资源,而java垃圾回收器只能管理程序
    中类的实例对象,没办法去管理系统产生的资源,所以程序需要调用close方法,去通
    知系统释放其自身产生的资源。
      

  7.   

    java这点很糟糕,没析构函数,像这种资源回收都必须显示调用,还要怕各种异常的干扰。C++里封装在析构函数里就行了
      

  8.   

    。。没看到是Android的,不过是一样的。
      

  9.   


    Yes, 我刚才发现你说的应该是对的。// Begin -- 我在网上搜索的
    public void close()
               throws IOException    关闭此输入流并释放与该流关联的所有系统资源。    InputStream 的 close 方法不执行任何操作。垃圾回收器,只对于类实例对象有用,而对于系统产生的资源占用没有作用// End -- 我在网上搜索的
    这样来看的确是会有内存泄漏的,不过该内存泄漏不是在类实例对象,而是系统资源。
    但是现在又有一个新问题,就是网上给的方法只是给人一个感性上的认识,而没有实际验证该结果。谁有办法可以在ubuntu上面验证上述的代码的确有内存泄漏呢?
    若有的话,请帖出来。LZ我要是研究好了的话也会帖出来的。
      

  10.   

    经常用到,一般最后都close掉
      

  11.   

    haohaohaohaohaohaohaohaohaohaohaohaohaohaohaohaohaohaohaohao
      

  12.   

    像这样,new 1000次,查看你的内存,你就明白了。
      

  13.   

    貌似会吧。一般都是在结尾close的
      

  14.   

    额,菜鸟不懂这个,但是我知道写close的。
      

  15.   

    在Java中,当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾。JVM的一个系统级线程会自动释放该内存块。void abc() {
     
    FileInputStream fin = new FileInputStream(strPathName);
     
     
    }
    fin对new FileInputStream(strPathName)内存块的引用,注意fin是局部的,fin离开其作用域后,fin无效,也即new FileInputStream(strPathName)内存块没有任何对象引用它,这时jvm会自动释放它。因此对于java而言,不会内存泄露。但对于c++来说,肯定会泄露。
      

  16.   

    肯定泄露了,不Close()的话,通道没有关闭啊。假如你循环使用的话,第一次用完没关闭,第二次就异常了!
      

  17.   

    这个和局部没有多大关系,涉及到i/o的,虚拟机和操作系统都会产生内存消耗,虚拟机自然是能回收fin这个局部资源,但是虚拟机之外的资源不一定会被释放掉。但是我不清楚new FileInputStream(strPathName)的时候,是否在构造里面就已经开辟了虚拟机之外的内存,有可能read的时候才需要close
      

  18.   

    new FileInputStream(strPathName)堆中的数据应该也有java虚拟机管理吧,当这片堆内存没有任何地方引用的时候,JVM就会释放它。
      

  19.   

    刚看了一下FileInputStream输入流的说明,FileInputStream构造函数会打开io输入流,需调用close释放打开的io资源,对于new出来的堆内存,由jvm来释放,无需delete.因此,上面的
    void abc() {
     
    FileInputStream fin = new FileInputStream(strPathName);
     
     
    }
    需加上fin.close(),否则io资源得不到释放,对于7X24小时的系统,如果频繁FileInputStream fin = new FileInputStream(strPathName);而不close,肯定会使系统io资源耗尽。
      

  20.   


    是的,我记得也是这样的,lz可以试试不写close的话,那个文件在别的地方是用不了的。
      

  21.   

    肯定有,JAVA并不是所有的东西都是很自动的,如果提供了close接口,肯定是要手动调用的。
      

  22.   

    答案是:会泄露FileInputStream fin 对象本身和里面所有成员变量等 都会释放, 这是针对JAVA类对象说的
    GC管理的就是JAVA的对象但是, FileInputStream是要打开文件的, 谁实现的呢?IoBridge类, open方法, 实际是jni调用,
    所以, 不调用FileInputStream.close()的话, 尽管JAVA对象都被GC了,但是fd文件描述符(native层)不会主动释放,造成内存泄露(打开文件必然占内存)
      

  23.   

    需写CLOSE()方法;不然内存会出现不足的情况,JVM的GC算法是在JVM休息的时候才去执行,如果一直没在休息的话,可想而知,内存不足,FILEINPUTSTREAM会卡死;那就有可能出现内存泄露的问题 ;至于上面说的会有一个系统的什么资源,可能是在所有程序中都有的情况吧,你在操作系统中运行你的程序难道操作系统不会加载的吗,大概的意思就是这样的;
      

  24.   


    对对对   fin这个流对象不会泄露 但是内存中流的缓冲区还是会泄露的
      

  25.   

    泄漏的可能不大。我知道PHP是由引擎在实例对象被释放的时候,通知上游释放资源的,所以PHP不会泄露。java没测试过,但是如果sun没这么设计的话,有点不大应该。
      

  26.   

     不会的。
      测试代码package com.test;import java.io.FileInputStream;
    import java.io.FileNotFoundException;public class TestGC { private static String FILE_PATH = "E:\\test.txt"; /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub int times = Integer.MAX_VALUE; for (int i = 0; i < times; i++) {
    test();
    System.out.println("Time: " + i);
    } } public static void test() {
    try {
    FileInputStream fin = new FileInputStream(FILE_PATH);
    } catch (FileNotFoundException e) {
    e.printStackTrace();
    }
    }}
    结果只是CPU使用率提高,但内存使用率基本没变。
      

  27.   

    小伙子,你这段代码泄露漏大发了,特别是这个方法在被频繁调用的使用。不信你可以看一看《JAVA核心技术》(原书第8版)下册的第2页。