gpt4 book ai didi

java - InputStream 在内存中是如何管理的?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:19:44 30 4
gpt4 key购买 nike

我熟悉 InputStream 的概念、缓冲区以及它们为何有用(例如,当您需要处理可能比机器 RAM 更大的数据时).

不过我想知道,InputStream 实际上是如何携带所有这些数据的?如果传输的数据过多,是否会导致 OutOfMemoryError

案例-场景

如果我从客户端连接到服务器,请求一个 100GB 的文件,服务器开始使用缓冲区遍历文件的字节,然后使用 outputStream.write(byte[ ])。出于某种原因,客户端现在还没有准备好读取 InputStream。服务器会无限期地继续发送文件的字节吗?如果是这样,outputstream/inputstream 是否会比其中一台机器的 RAM 大?

最佳答案

InputStreamOutputStream 实现通常不会使用大量内存。事实上,这些类型中的“Stream”一词意味着它不需要保存数据,因为它是以顺序方式访问的——就像溪流可以在之间传输水一样一个湖泊和海洋,本身没有大量的水。

但是“流”并不是描述这一点的最佳词。它更像是一个管道,因为当您将数据从服务器传输到客户端时,每个阶段都会从控制数据发送速率的客户端传输背压。这类似于您的水龙头如何控制通过管道一直到城市水库的流速:

  1. 当客户端读取数据时,InputStream 仅在其内部(小)缓冲区为空时才从操作系统请求更多数据。每个请求只允许传输有限数量的数据;
  2. 当操作系统请求数据时,它自己的内部缓冲区清空,并通知服务器有多少空间可用于新数据。服务器只能发送这么多(在 TCP 中称为“流量控制”:https://en.wikipedia.org/wiki/Transmission_Control_Protocol#Resource_usage)
  3. 在服务器端,当客户端有空间接收数据时,服务器端操作系统从其内部缓冲区发送数据。当它自己的内部缓冲区变空时,它允许写入过程用更多数据重新填充它。
  4. 当服务器端进程向其OutputStream 写入() 时,OutputStream 将尝试将数据写入操作系统。当操作系统缓冲区已满时,它会让服务器进程等待,直到服务器端缓冲区有空间接受新数据。

请注意,缓慢的客户端会使服务器进程花费很长时间。如果您正在编写服务器,并且您不控制客户端,那么考虑这一点并确保在进行长时间的数据传输时不会占用大量服务器端资源非常重要。

关于java - InputStream 在内存中是如何管理的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53977817/

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