假设我有一个运行的servlet,它接受来自客户端应用程序的任何大小的文件。正在发送的文件被加载到DataHandler中并由Web服务传输;因此收到并放回DataHandler。如果发送的文件超过接收主机上可用RAM的大小,会发生什么?
我最初的想法是:
1)JVM
只会把它放在虚拟内存中,因为通过标题消息已经知道了文件的大小,JVM
可能是偷偷摸摸的并且在前面分配空间时间。但是,我并不认为虚拟内存空间会变大。
2)JVM
将创建一个“隐藏”文件来保存硬盘上的所有数据,然后DataHandlers
输出流将根据需要将数据加载回RAM。
在任何一种情况下,似乎将文件写入硬盘似乎更容易,但我想避免这种情况,因为我将在收到数据后立即使用数据。托管servlet
的服务器将有许多不同的客户端都在同一时间发送大文件,我想知道JVM
将如何处理这样的问题。
答案 0 :(得分:1)
servlet api提供请求和响应的流。请求上的输入流只会根据需要将字节加载到JVM中。
流不会将所有数据保存在内存中,对read()的调用最终会从一个小缓冲区中获取一些数据或导致套接字上的阻塞读取。应用程序可能会尝试将整个大型流读取到字节数组或其他数据结构中,然后就会耗尽内存。
您可以在应用服务器(如tomcat或jetty)的代码中查看它们与套接字的交互方式。这是一个from tomcat。