servlet 如何处理比可用 RAM 更多的字节?
How does a servlet handle more bytes than available RAM?
假设我有一个 servlet 运行,它接受来自客户端应用程序的任何大小的文件。正在发送的文件被加载到 DataHandler 中并由 web-services 传输;接收并放回 DataHandler 中。如果发送的文件超过接收主机上可用 RAM 的大小会怎样?
我的初步想法是:
1) JVM
只会把它放在虚拟内存中,因为文件的大小已经通过 header 消息知道了,而 JVM
可能是偷偷摸摸的并提前分配 space 。但是,我认为虚拟内存 space 不会变大。
2) JVM
将创建一个 "hidden" 文件来保存硬盘上的所有数据,然后 DataHandlers
输出流将数据加载回 RAM如所须。
在任何一种情况下,将文件写入硬盘似乎更容易,但我想避免这种情况,因为我将在收到数据后立即使用它。托管 servlet
的服务器将有许多不同的客户端都在大约同一时间发送大文件,我想知道 JVM
将如何处理此类问题。
servlet api 提供关于请求和响应的流。请求中的输入流只会根据需要将字节加载到 JVM 中。
流不会将所有数据保存在内存中,对 read() 的调用最终会从小缓冲区中获取一些数据或导致套接字上的阻塞读取。应用程序可能会尝试将整个大流读取到字节数组或其他数据结构中,然后您可能 运行 内存不足。
您可以查看 tomcat 或 jetty 等应用程序服务器的代码,了解它们如何与套接字交互。这是一个 from tomcat.
假设我有一个 servlet 运行,它接受来自客户端应用程序的任何大小的文件。正在发送的文件被加载到 DataHandler 中并由 web-services 传输;接收并放回 DataHandler 中。如果发送的文件超过接收主机上可用 RAM 的大小会怎样?
我的初步想法是:
1) JVM
只会把它放在虚拟内存中,因为文件的大小已经通过 header 消息知道了,而 JVM
可能是偷偷摸摸的并提前分配 space 。但是,我认为虚拟内存 space 不会变大。
2) JVM
将创建一个 "hidden" 文件来保存硬盘上的所有数据,然后 DataHandlers
输出流将数据加载回 RAM如所须。
在任何一种情况下,将文件写入硬盘似乎更容易,但我想避免这种情况,因为我将在收到数据后立即使用它。托管 servlet
的服务器将有许多不同的客户端都在大约同一时间发送大文件,我想知道 JVM
将如何处理此类问题。
servlet api 提供关于请求和响应的流。请求中的输入流只会根据需要将字节加载到 JVM 中。
流不会将所有数据保存在内存中,对 read() 的调用最终会从小缓冲区中获取一些数据或导致套接字上的阻塞读取。应用程序可能会尝试将整个大流读取到字节数组或其他数据结构中,然后您可能 运行 内存不足。
您可以查看 tomcat 或 jetty 等应用程序服务器的代码,了解它们如何与套接字交互。这是一个 from tomcat.