2014-01-09 105 views
3

我正在为WebSphere的response.getOutputStream()写一个很大的响应(数百Mb)。 看来,Web Sphere始终将整个输出流数据存储在某些内部内存缓冲区中,然后再将其提供给客户端。因此,我的服务器处理(生成数据)在几秒钟内完成,而浏览器可能仍在下载半小时。在那段时间内,整个响应仍保存在内存中。WebSphere响应缓存

是否可以避免这种缓冲? 我会优先考虑更多的等待输出流的servlet线程,而不是浪费内存的千兆位。

我的Web Sphere版本是8.5.0。

我试过设置内容长度和分块响应 - 它们都一样,仍然缓冲。 我的TCP传输链设置是32 KB响应缓冲区的默认设置,但它以某种方式被忽略。

回答

5

同时在WAS web容器custom properties中找到答案。

默认情况下,Web容器使用异步写入将响应数据写入区块直至响应缓冲区大小。对于大于响应缓冲区大小的较大响应,Web容器继续将响应数据缓冲到内存中,同时等待响应数据块的异步写入完成。此过程可能导致部分内存中存在大量响应,这可能导致内存使用率过高并可能导致内存不足错误。当服务器同时处理比Web容器定义的线程更多的请求时,也可能发生应用程序服务器挂起。

如果com.ibm.ws.webcontainer.channelwritetype属性设置为同步,则使用同步写入,否则默认情况下使用异步写入。通过同步写入,响应数据以最大为响应缓冲区大小的块的形式同步写入,并且在等待响应数据块的同步写入完成时,不会将响应数据缓存到内存中。因此,内存中保存的近似最大响应数据量等于responsebuffersize乘以Web容器线程数量。 Web容器可以同时处理的最大请求数受Web容器线程数限制。其他请求排队,等待正在处理的请求完成。

responsebuffersize web容器自定义属性定义Web容器在单个块中写入的最大响应数据量,默认为32k。因此,它用于更改Web容器发送完整响应数据所需的写入次数。但是,如果应用程序刷新响应数据,则无论响应缓冲区大小如何,都会立即写入由Web容器保存的任何响应数据。

使用以下名称 - 值对使用同步写入来写入数据块。

com.ibm.ws.webcontainer。channelwritetype async

+0

我想你应该接受你自己的答案。 – fnt

+0

是的,这也对我们有效。百+ MB大小的PDF – Renan

1

您确定此数据是由Websphere存储在内部内存缓冲区中吗? Websphere通道输出缓冲区一次只能保存32K的数据。所以剩下的数据可能是由您的servlet保存的,因为您已经生成了一些存储在堆中的大数据,并由您的代码引用。

看看你的代码,看看你的代码引用了什么数据,如果你想知道存储在内存中的内容以及谁在保持活动状态,请拍摄堆(堆转储)的快照。

+0

我已经开始浏览代码并调查内存使用情况,发现没有任何可疑内容。我结束了一个简单的测试servlet,它只是将字节写入输出流,它不存储任何东西。而且,本身使用本地内存作为“asyc响应”缓冲区,所以它不可见作为堆的一部分。 –