我非常赞同Toby和John Vasileff的观点-如果您可以容忍相关问题,S3非常适用于卸载大型媒体对象。(自己的应用程序实例化10-1000MB FLV和MP4。)例如:没有部分请求(字节范围标头)。但是,必须手动处理它,偶尔停机等等。
如果不行,John的代码看起来很好。 我发现2k FILEBUFFERSIZE的字节缓冲区在微基准测试中最有效。另一种选择可能是共享FileChannel。(FileChannels是线程安全的。)
话虽如此,我也要补充说,猜测什么导致了内存不足错误是经典的优化错误。通过使用严格的指标,您将提高成功的机会。
1.将 -XX:+ HeapDumpOnOutOfMemoryError 放入JVM启动参数中,以防万一
2. 在负载下使用jmap运行JVM(jmap-histo<pid>)
3. 分析指标(jmap -histo输出或由jhat查看堆转储)。 很可能,您的内存不足来自意想不到的地方。
当然还有其他工具可用,但jmap和jhat随Java 5+“开箱即用”。
引用:
我考虑过将文件写入本地临时驱动器,然后生成另一个线程来处理流,以便可以重复使用tomcat servlet线程。 这似乎会非常I / O密集。
啊,我认为您不能这样做。 即使您可以,它听起来也有问题。 管理连接的Tomcat线程需要控制。 如果您遇到线程饥饿,则增加./conf/server.xml中可用线程的数量即可。 同样,指标是检测此问题的方法-不要只是猜测。
问题:您还在EC2上运行吗? 您的tomcat的JVM启动参数是什么?