繁体   English   中英

OutOfMemoryError:Java堆空间错误

[英]OutOfMemoryError: Java heap space error

我遇到了我不了解的内存问题。 我有以下情况

情况1

public  byte[] getBytes(InputStream is) throws IOException {

            int len;
            int size = 1024;
            byte[] buf;

              ByteArrayOutputStream bos = new ByteArrayOutputStream();
              buf = new byte[size];
              while ((len = is.read(buf, 0, size)) != -1)
              {
                bos.write(buf, 0, len);
              }
              buf = bos.toByteArray();

            return buf;
          }

Public void dosomething()
{
 //instructions
InputStream is = new ByteArrayInputStream(getBytes(bodyPart.getInputStream()));

}

工作正常,没有错误

但是这个

情况二

Public void dosomething()
{
 //instructions
ByteArrayOutputStream bos = new ByteArrayOutputStream();
                    int len;
                    int size = 1024;
                    byte[] bufferFichierEntree = new byte[size];
                     while ((len = bodyPart.getInputStream().read(bufferFichierEntree, 0, size)) != -1)
                     {
                         bos.write(bufferFichierEntree, 0, len);
                     }
InputStream is = new ByteArrayInputStream(bufferFichierEntree);

}

返回java.lang.OutOfMemoryError:Java堆空间,不知道为什么? 唯一的区别是,在第一种情况下,我使用的功能与第二种情况不同

while ((len=bodyPart.getInputStream().read(bufferFichierEntree, 0, size)) != -1) 

您在每个循环中创建新的InputStream,因此您仅在每个循环中读取第一个字节。

尝试在一段时间之前创建输入流,并像在第一个示例中那样使用它。

其原因可能是:

当使用两种方法时, ByteArrayOutputStream超出范围,可以由垃圾回收器(GC)清除。

仅使用一种方法,缓冲区就不能被GC清理,因为它仍然在作用域内,除非您将其无效。

当然,另一个原因可能是您每次在循环内创建一个新的InputStream,因为我们bodyPart.getInputStream()知道bodyPart.getInputStream()作用。 如果是这种情况,请按以下方式解决:

InputStream in = bodyPart.getInputStream();
while ((len = in.read(bufferFichierEntree, 0, size)) != -1)
{
    bos.write(bufferFichierEntree, 0, len);
}

似乎是getInputStream的范围界定问题,在第一个示例中,您使用1个InputStream,在第二个中使用无穷大,并每次读取前1000个字节。 如果您将其更改为喜欢;

 InputStream is = bodyPart.getInputStream(); while ((len = is.read(bufferFichierEntree, 0, size)) != -1) { 

它应该按预期运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM