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