Как восстановиться из подпроцесса JVM под управлением OOM? - PullRequest
0 голосов
/ 28 июня 2018

У меня есть два процесса JVM A и B. Процесс A связывается с пользователем и использует B в качестве ведомого для выполнения сложных вычислений: User -> A -> B.compute

Тем не менее, метод B.compute может исчерпать память для определенных входов (невозможно знать, какой). В таком случае я хочу сообщить пользователю, что введенные им данные ввода не подходят, и я хочу перезапустить B.

Я нашел следующие (не очень подробные) решения в Google:

  • поймать ошибку в B catch (OutOfMemoryException e)
  • использовать опцию JVM -XX:OnOutOfMemoryError=restart-command
  • вручную перезапустить B с A

Какой метод наиболее подходит для использования?

Пожалуйста, покажите минимальный (независимый от ОС) рабочий пример.

1 Ответ

0 голосов
/ 29 июня 2018

Разрешение внезапного завершения работы JVM никогда не было хорошим дизайном для любого приложения.

Если вы знаете, что есть ситуации, которые могут это вызывать, я бы разработал процесс B, чтобы отслеживать использование собственной памяти, а затем прекратить обработку данных, если он исчерпает память.

Вы можете сделать это так же просто, как:

Runtime rt = Runtime.getRuntime();
long usedMem = (rt.totalMemory() - rt.freeMemory()) / 1024 / 1024;

Вы можете установить пороговое значение для свободной памяти, когда ваш процесс B прекратит обработку ввода, выбросит все результаты и сообщит A, что это ошибочный ввод. Сборщик мусора вернет неиспользуемую память и вернет B для готовности к дополнительному вводу (если вам действительно нужно, вы можете сделать явный вызов System.gc (), чтобы форсировать это, но я бы не рекомендовал это).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...