32-битная JVM, ProcessBuilder.start () и ENOMEM - PullRequest
3 голосов
/ 06 января 2012

Одно приложение, с которым мне приходится иметь дело, регулярно запускает помощников оболочки, используя ProcessBuilder.По непонятным причинам он все еще работает на 32-битной JVM (Sun, 1.6.0.25), хотя базовая ОС имеет 64-битную версию (RHEL 5.x).

Это приложение удовлетворяет памяти, поэтомуМаксимальный размер кучи - 3 ГБ, а permgen - 128 МБ.

Однако ... В случайные моменты помощники оболочки не запускаются.Не из-за OutOfMemory, а из-за ENOMEM ... Единственная причина, по которой я это вижу, - это отсутствие адресного пространства.

Ну, конечно, но в то же время память на самом деле не находится под давлением и top сообщает, что фактическое использование памяти JVM и размер его виртуального набора даже не составляют 3 ГБ ...

Глядя на то, что можно посмотреть в коде Process, я вижу, что ядрометод называется forkAndExec(), что в значительной степени самоочевидно ... Из того, что я знаю об обоих системных вызовах, он просто не должен потерпеть неудачу.Но это так.И не всегда.

Почему?

edit : следует отметить, что используется neo4j.Кажется, он часто использует FileChannel, может ли это быть причиной отсутствия адресного пространства?

Ответы [ 2 ]

1 голос
/ 06 января 2012

Я бы уменьшил размер кучи. Объем фактически используемой кучи может оставить все меньше и меньше места для запуска разветвленного процесса (он наследует ресурсы от своего родителя)

Весьма вероятно, что простое обновление до 64-битной JVM решит проблему. Можете ли вы попробовать вместо этого обновить 64-битную версию Java 6 (просто чтобы увидеть, решит ли она проблему) Если это произойдет или нет, это должно рассказать больше о причине (и тогда вы можете решить, стоит ли ее переключать)

1 голос
/ 06 января 2012

Я думаю, что вас укусил Память Linux слишком часто убивает ваши процессы. В этом посте предлагается переменная sysctl, которую вы можете настроить.

...