Простой ответ: потому что другие операции не имеют требований к памяти для операции, которая завершается неудачей.
Более длинный ответ начинается с просмотра трассировки стека:
java.lang.OutOfMemoryError: Java heap space at java.lang.reflect.Array.newArray(Native Method) at
java.lang.reflect.Array.newInstance(Unknown Source) at java.io.ObjectInputStream.readArray(Unknown Source) at
java.io.ObjectInputStream.readObject0(Unknown Source) at java.io.ObjectInputStream.defaultReadFields(Unknown
...
sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source) at
Итак, поток, который не работает, пытается создать новый массив для обработки входящего запроса. Если этот массив особенно велик, обработчик запросов может быть не в состоянии выделить его, в то время как другие запросы, использующие меньшие объемы данных, будут обрабатываться без проблем.
Итак, первый вопрос: насколько велик этот массив? Вы должны поставить некоторые записи на стороне клиента, чтобы определить это. И если конкретный клиент пытается отправить исключительно большой массив, вам может потребоваться уменьшить его размер.
Второй вопрос: предоставили ли вы серверной JVM достаточно памяти для обработки ожидаемой нагрузки? Jave - одна из немногих сред, в которых все еще требуется указывать объем памяти, необходимый программе, и по умолчанию она достаточно мала (я думаю, 64M). Просмотрите параметры -ms и -mx, чтобы узнать, как его увеличить.