我在使用以下代码时遇到堆溢出错误。有人可以告诉我我在做什么错吗?

在调试时,我看到taht的值是709582875

In main function

File file = new File(fileLocation+fileName);
if(file.exists()){
s3Client.upload(bucketName,fileName,getBytesFromFile(file));
}


// Returns the contents of the file in a byte array.
public static byte[] getBytesFromFile(File file) throws IOException {
InputStream is = new FileInputStream(file);

// Get the size of the file
long length = file.length();

// You cannot create an array using a long type.
// It needs to be an int type.
// Before converting to an int type, check
// to ensure that file is not larger than Integer.MAX_VALUE.
if (length > Integer.MAX_VALUE) {
// File is too large
log.debug("file is too large"+length);
System.out.println("file is too large"+length);
}

if (length < Integer.MIN_VALUE || length > Integer.MAX_VALUE) {
throw new IOException
(length + " cannot be cast to int without changing its value.");
}

// return "test".getBytes();
// Create the byte array to hold the data

try{
byte[] bytes = new byte[(int)length];
}
catch(OutOfMemoryError e){ System.out.println(e.getStackTrace().toString());}

// Read in the bytes
int offset = 0;
int numRead = 0;
while (offset < bytes.length
&& (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {
offset += numRead;
}

// Ensure all the bytes have been read in
if (offset < bytes.length) {
throw new IOException("Could not completely read file "+file.getName());
}

// Close the input stream and return bytes
is.close();
return bytes;
}

最佳答案

问题在于您分配的字节数组太大,并且会耗尽堆空间。

您可以尝试使用-Xms和-Xmx选项运行程序,以指定Java虚拟机用来运行程序的最小和最大堆空间。

但我建议您不要将整个文件读入字节数组进行处理。您可以将其一部分读入一个小字节数组中,进行处理,然后继续进行下一部分。这种方式使用较少的堆空间。

08-18 02:10