解决方案 »

  1.   

    一般来说你看到有 close 的方法它会自动先 flush 一次再 close,明确的 flush 只是更保险,多数 API 都是会在 close 之前尝试 flush 的。out = null; 这句只要不是在条件式无穷循环中,就不是必须的。如果一个后台线程运行  7 x 24 的功能,应该在循环中明确地把变量赋值为 null。
      

  2.   

    out.flush(); 是把输出流立即发送到应答中。
    out.close();关掉out锁占用的资源,避免资源占用内存过多,导致一些内存溢出,或者服务器慢,最后没有响应最终挂掉。
    out =null,把次对象编程一个弱引用,当GC运行时方便收回。
      

  3.   

    这里不用手动去做关闭操作的,WEB容器会自动来管理的;当你的请求完毕后Response的IO操作会被自动进行检测并关闭的。
      

  4.   

    哦哦,原来是这样子,它会自动先进行一次flush那我应该就不用flush了,刚查看了下close的源代码/**
         * Close the stream.
         * @see #checkError()
         */
        public void close() {
    try {
        synchronized (lock) {
    if (out == null)
        return;
    out.close();
    out = null;
        }
    }
    catch (IOException x) {
        trouble = true;
    }
        }那这个out=null也应该不需要了,嗯!谢谢啊!
      

  5.   

    正确,明确地赋值在无穷式循环中是应该的,处理地不恰当当导致内存用光。比如下面这种:while(var如果不停机一直运行) {
       MyBigObject c = new MyBigObject(); 
    }看起来这个变量是局部变量,但当如果这个对象占用内存较多时这个循环长时间运行会占用很多内存,可能导致 OutOfMemoberyError 。这个变量虽然声明在 while 循环中,但实际上它在当前方法内都一直存在的,只是仅在 while 循环内可见,只是可见性的差别。这个时候明确地赋值为 null 是应该的。
    哦哦,原来是这样子,它会自动先进行一次flush那我应该就不用flush了,刚查看了下close的源代码/**
         * Close the stream.
         * @see #checkError()
         */
        public void close() {
    try {
        synchronized (lock) {
    if (out == null)
        return;
    out.close();
    out = null;
        }
    }
    catch (IOException x) {
        trouble = true;
    }
        }那这个out=null也应该不需要了,嗯!谢谢啊!
      

  6.   

    一般flush没啥用,比如数据比较大,你可以flush,比如超大图片,加载1/3了你flush一下,就能看到1/3的图了。一般close足够