我在使用ByteArrayOutputStream
写入文件时遇到内存错误。代码如下:
ByteArrayOutputStream data = getNewData();
while (data.size() > 0) {
try (OutputStream outputStream = new FileOutputStream("data.txt", true)) {
data.writeTo(outputStream);
} catch (IOException ex) {
throw new RuntimeException(ex);
}
data = getNewData();
}
我怀疑重新分配变量data
不会以某种方式清除旧值,但我不知道如何证明这一点,因为理论上垃圾收集器应该删除旧值。我想我漏掉了什么...
2条答案
按热度按时间vof42yt11#
一旦
data
被重新分配,垃圾收集器将清理旧的ByteArrayOutputStream
。但是这种重新分配只有在getNewData()
返回时才会发生。当getNewData()
运行时,内存中将有旧的ByteArrayOutputStream
(由data
引用)和新的ByteArrayOutputStream
(可能是在getNewData()
中创建的)。您可以提前取消引用旧的
ByteArrayOutputStream
:zujrkrfu2#
ByteArrayOutputStream
写入文件时遇到内存错误。..."*尝试使用 * 字节数组 *。
这里有一个例子。
data
不会以某种方式清除旧值,但我不知道如何证明这一点,因为理论上垃圾收集器应该删除旧值。..."*变量赋值将丢弃之前的任何值,按照 Java 语法。