假设我有一个正在运行的 servlet,它接受来自客户端应用程序的任何大小的文件。正在发送的文件被加载到 DataHandler 中并由 Web 服务传输;这样被接收并放回DataHandler。如果发送的文件超过接收主机上可用 RAM 的大小会怎样?
我最初的想法是:
1)JVM
将把它放在虚拟内存中,因为文件的大小已经通过标题消息和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/