java - servlet 如何处理比可用 RAM 更多的字节?

标签 java performance servlets jvm

假设我有一个正在运行的 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/

相关文章:

c++ - 如何优化具有已知瓶颈的计算密集型 C++ 程序?

java - 向界面添加信息

http - 如何删除传输编码 : chunked in the HTTP response

java - 覆盖 JTextField 的 getText

java - 通过 Tibco JMS 发送 Serializable 对象会引发反序列化失败错误

java - Java从ASCII整数到字符的转换产生未知值

c# - 有效去除相同斜率的点

c# - C#代码获得最高的SQL Server 2012写入性能

java - 导入Excel数据并使用JSP将其存储在数据库中

java - JSP-单击按钮时更新textarea