• ByteArrayInputStream之内存溢出(IoUtils)


    今天一同事做了批量导入数据的功能,但是服务器老是死机。查看服务器内存8G的内存占了7G多,很明显是内存泄漏。后来发现对文件的操作的时候用到了ByteArrayInputStream,仔细查看代码看到了ByteArrayInputStream并没有释放,问题差不多就是这个了,然后想着关闭流,自然的想到了ByteArrayInputStream.close()方法。后经网络查证,close方法在ByteArrayInputStream声明的是空的,原来ByteArrayInputStream是基于内存Byte数组的流,不需要close,当没有强引用的时候会自动被垃圾回收了,所以close实现为空。而后想办法关掉流,用到了org.apache.commons.io.IoUtils工具类。

    引用网上的介绍:

    该类为input/output操作提供了通用静态方法,可以无条件的关闭任何流。

    包括功能:

    •closeQuietly——这些关闭一个流的方法将忽略nulls和例外的情况。

    •toXxx/read-这些方法从一个流读取数据。

    • write这些方法将数据写到一个流里。

    copy——这些方法用于从一个流的所有的数据复制到另一个流。

    •contentEquals——这些方法用于比较两个流的内容。

    下面是一个关闭的实例(红色的部分):

    package org.test.toolkit.file;

    import java.io.ByteArrayInputStream;

    import java.io.ByteArrayOutputStream;

    import java.io.IOException;

    import org.apache.commons.io.IOUtils;

    import org.apache.poi.poifs.filesystem.DirectoryEntry;

    import org.apache.poi.poifs.filesystem.POIFSFileSystem;

    public class DocFile extends RandomFile {
    public static final String EXTENSION = FileType.DOC.toString();

    private static final String WORD_TYPE = "WordDocument";

    private static byte[] getContentBytes() {
    byte byteArray[] = FileUtil.getRandomBytes();

    ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArray);

    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

    try {
    POIFSFileSystem fs = new POIFSFileSystem();

    DirectoryEntry directory = fs.getRoot();

    directory.createDocument(WORD_TYPE, byteArrayInputStream);

    fs.writeFilesystem(byteArrayOutputStream);

    return byteArrayOutputStream.toByteArray();

    } catch (IOException e) {
    throw new RandomFileException("create doc file content fail", e);

    } finally {
    IOUtils.closeQuietly(byteArrayInputStream);

    IOUtils.closeQuietly(byteArrayOutputStream);

    }

    }

    public DocFile() {
    super(EXTENSION, getContentBytes());

    }

    }


    ————————————————
    版权声明:本文为CSDN博主「youyedemeng」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/youyedemeng/article/details/21740093

  • 相关阅读:
    Linux中/etc目录下passwd和shadow文件
    Linux基本命令
    Linux目录结构说明与基本操作
    如何用虚拟机VMware Workstation安装CentOs-7
    VPP源码分析及流程图
    VPP环境搭建及配置
    【转】智能指针的交叉引用问题及解决方法
    二叉树的前 中 后 层序遍历
    排序算法
    C和C++的一些区别
  • 原文地址:https://www.cnblogs.com/javalinux/p/15696255.html
Copyright © 2020-2023  润新知