我正在将一堆二进制文件(一次一个)读入内存以对它们执行一些操作,然后将它们保存回磁盘。对于小文件,它工作得非常好,但是,对于较大的文件,我有很多担忧。
现在,假设我正在阅读的文件是 25Mb 大 - 这就是我的代码的样子: -
public static byte[] returnEncryptedFileData(File fileObj) {
byte[] fileData = FileUtils.readFileToByteArray(fileObj);
//now performing some operations on fileData
return fileData;
}
在这段代码执行之后,我看到 (50Mb + MISC) 的额外空间消耗(这很好,因为会有 2 个字节数组 - 一个是我定义的 fileData,另一个是 readFileToByteArray 用来执行操作的,每个都持有25Mb 的数据)
但是,即使在此方法返回并再次调用下一个要读取的文件后,之前持有的内存也不会释放!如果正在读取的下一个文件是 30Mb 大,我会看到 (50Mb + 60Mb + MISC) 的内存消耗
如何在将文件读取到字节数组后进行清理,对其执行一些操作,然后从方法中返回它。System.gc() 没有帮助,因为它不会立即执行 GC.. 我认为不可能“释放”内存?
我在这里做错了什么?