quizás lo mejor es que no mandes el fichero todo de una, o sea, que envíes una parte, guardes un marcador de los bytes enviados, llamar al gc (que no garantiza que se ejecute inmediatamente) y sigas enviando otra parte, o quizás poniendo el envío de fichero dentro de un hilo, y pausándolo para darle un respiro a la jvm... pero la verdad no estoy demasiado seguro que sea una solución, creo que lo mejor es que pruebes y nos cuentes...
Si tienes alguna duda sobre cómo hacer algo de esto me preguntas