Разрешение внезапного завершения работы JVM никогда не было хорошим дизайном для любого приложения.
Если вы знаете, что есть ситуации, которые могут это вызывать, я бы разработал процесс B, чтобы отслеживать использование собственной памяти, а затем прекратить обработку данных, если он исчерпает память.
Вы можете сделать это так же просто, как:
Runtime rt = Runtime.getRuntime();
long usedMem = (rt.totalMemory() - rt.freeMemory()) / 1024 / 1024;
Вы можете установить пороговое значение для свободной памяти, когда ваш процесс B прекратит обработку ввода, выбросит все результаты и сообщит A, что это ошибочный ввод. Сборщик мусора вернет неиспользуемую память и вернет B для готовности к дополнительному вводу (если вам действительно нужно, вы можете сделать явный вызов System.gc (), чтобы форсировать это, но я бы не рекомендовал это).