・クライアントからの入力をjavax.servlet.ServletInputStreamから受け取り、java.io.ByteArrayOutputStreamを使ってI/O処理で大きなファイルをアップロードした場合、jvmのヒープ上に一時的にすべてのアップロードデータを格納してから、ファイルとして吐き出す動きとなり、もしアップロードサイズがJVMのヒープ領域が最大量(Vmx値)を超えてしまうと、OutOfMemoryエラーとなってしまいアップロードが失敗してしまうらしい。
http://www.atmarkit.co.jp/ait/articles/0306/12/news001.html
・このほかにも、通信が不安定な場合の待ち時間やタイムアウトも考慮する
・要件で許されるならアップロードファイルのサイズ制限もする
・アップロードしたファイルが破損してないかをチェックする
・もしタイムアウトやチェックサム値が異常でアップロードが失敗した場合にはリトライさせる
・アップロードするファイルのロストが絶対に許されないミッションクリティカルな場合は、送信側と受信側でキューを備えて石橋を叩いて渡る
※アップロード元がブラウザならダメだけど。
※アップロード元がftpやsftpクライアントの場合は品質を高めるために事前に上記のような冗長的な機構を追加する