gpt4 book ai didi

java - 管理流使用期间的内存使用情况

转载 作者:行者123 更新时间:2023-12-02 01:33:53 24 4
gpt4 key购买 nike

我有一个程序,它在 OutputStream 上有一个包装器,在包装器内有一个流列表。看看下面的代码

private static final class SomeWrapper extends OutputStream {

private final List<OutputStream> dest;

@Override
public void write(int b) throws IOException {
for (OutputStream destination : dest) {
destination.write(b);
}
}

@Override
public void write(byte[] bytes, int off, int len) throws IOException {
for (OutputStream destination : dest) {
destination.write(bytes, off, len);
}
}

@Override
@SneakyThrows
public void close() {
super.close();
for (OutputStream destination : dest) {
destination.close();
}
dest.clear();
}
}

因此,如果包装器包含大量 OutputStreams - 应用程序会因 OOM 而崩溃。这里什么模式或方法会更好,以控制我可以根据系统资源使用多少流(例如 Xmx 可以是 512Mb 和 2Gb)。 dest - 是 BufferedOutputStream 的列表。所以里面我有一个缓冲区

最佳答案

我不明白为什么会使用那么多内存,除非所有输出流都有一个巨大的缓冲区或者你有大量的输出。您使用了多少个输出?为什么?

控制内存的一种方法是,如果可以的话,对输入流进行多次传递。这显然会以牺牲性能为代价。这里有一个建议:

  • 如果输入流的获取速度很慢(例如从网络),请考虑将其写入磁盘以开始
  • 确定how much memory your JVM has
  • 明确设置输出流的缓冲区大小,以便您控制它们使用的内存量
  • 确定可用内存中可以容纳多少个缓冲区,并实例化大约 80% 的缓冲区以留出一些空间。
  • 执行第一遍,写入前 N 个输出。从第一步中写入磁盘的文件中读取以加快进程。
  • 迭代直到完成
  • 不要忘记清理缓存的输入文件

请注意,如果只有一个批处理,您可以完全跳过第一步,并从任何地方获取输入流一次。另外,此解决方案假设您有足够的磁盘空间来存储输入,如果没有,您可以忽略缓存部分。

关于java - 管理流使用期间的内存使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57537272/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com