Как решить «java.io.IOException: ошибка = 12, не удается выделить память», вызывая Runtime # exec ()?

В моей системе я не могу запустить простое приложение Java, которое запускает процесс. Я не знаю, как решить.

Не могли бы вы дать мне несколько советов, как решить?

Программа:

[[email protected] sisma-acquirer]# cat prova.java
import java.io.IOException;

public class prova {

   public static void main(String[] args) throws IOException {
        Runtime.getRuntime().exec("ls");
    }

}

Результат:

[[email protected] sisma-acquirer]# javac prova.java && java -cp . prova
Exception in thread "main" java.io.IOException: Cannot run program "ls": java.io.IOException: error=12, Cannot allocate memory
        at java.lang.ProcessBuilder.start(ProcessBuilder.java:474)
        at java.lang.Runtime.exec(Runtime.java:610)
        at java.lang.Runtime.exec(Runtime.java:448)
        at java.lang.Runtime.exec(Runtime.java:345)
        at prova.main(prova.java:6)
Caused by: java.io.IOException: java.io.IOException: error=12, Cannot allocate memory
        at java.lang.UNIXProcess.<init>(UNIXProcess.java:164)
        at java.lang.ProcessImpl.start(ProcessImpl.java:81)
        at java.lang.ProcessBuilder.start(ProcessBuilder.java:467)
        ... 4 more

Конфигурация системы:

[[email protected] sisma-acquirer]# java -version
java version "1.6.0_0"
OpenJDK Runtime Environment (IcedTea6 1.5) (fedora-18.b16.fc10-i386)
OpenJDK Client VM (build 14.0-b15, mixed mode)
[[email protected] sisma-acquirer]# cat /etc/fedora-release
Fedora release 10 (Cambridge)

РЕДАКТИРОВАТЬ: Решение Это решает мою проблему, я не знаю точно, почему:

echo 0> /Труды /системы /VM /overcommit_memory

Голосование за то, кто может объяснить:)

Дополнительная информация, верхний вывод:

top - 13:35:38 up 40 min,  2 users,  load average: 0.43, 0.19, 0.12
Tasks: 129 total,   1 running, 128 sleeping,   0 stopped,   0 zombie
Cpu(s):  1.5%us,  0.5%sy,  0.0%ni, 94.8%id,  3.2%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1033456k total,   587672k used,   445784k free,    51672k buffers
Swap:  2031608k total,        0k used,  2031608k free,   188108k cached

Дополнительная информация, бесплатный вывод:

[[email protected] sisma-acquirer]# free
             total       used       free     shared    buffers     cached
Mem:       1033456     588548     444908          0      51704     188292
-/+ buffers/cache:     348552     684904
Swap:      2031608          0    2031608
66 голосов | спросил Andrea Francia 14 J000000Tuesday09 2009, 15:20:00

10 ответов


0

Какой профиль памяти у вашей машины? например если вы запустите top, сколько у вас свободной памяти?

Я подозреваю, что UnixProcess выполняет fork() и он просто не получает достаточно памяти от ОС (если память будет работать, он fork() будет дублировать процесс, а затем exec() для запуска ls в новом процессе памяти, и это не так уж далеко)

РЕДАКТИРОВАТЬ: Re. Ваше решение для избыточной загрузки позволяет разрешить избыточную загрузку системной памяти, возможно, позволяя процессам распределять (но не использовать) больше памяти, чем фактически доступно. Поэтому я предполагаю, что fork() дублирует память процесса Java, как описано в комментариях ниже. Конечно, вы не используете память, так как 'ls' заменяет повторяющийся процесс Java.

ответил Brian Agnew 14 J000000Tuesday09 2009, 15:27:07
0

Это решение, но вы должны установить:

echo 1 > /proc/sys/vm/overcommit_memory
ответил Michael 22 J0000006Europe/Moscow 2010, 17:38:45
0

Это решено в Java версии 1.6.0_23 и выше.

Подробнее см. на http://bugs.sun.com/bugdatabase/view_bug.do?bug_id = 7034935

ответил Alf Høgemark 3 FebruaryEurope/MoscowbFri, 03 Feb 2012 14:58:28 +0400000000pmFri, 03 Feb 2012 14:58:28 +040012 2012, 14:58:28
0

Runtime.getRuntime().exec выделяет процесс с тем же объемом памяти, что и основной. Если вы установили кучу в 1 ГБ и попытаетесь выполнить, тогда она выделит еще 1 ГБ для запуска этого процесса.

ответил Attila Bukta 4 Mayam10 2010, 03:19:40
0

Я наткнулся на эти ссылки:

http: //mail.openjdk. java.net/pipermail/core-libs-dev/2009-May/001689.html

http://www.nabble.com/Review-request- для-5049299-td23667680.html

Кажется, это ошибка. Рекомендуется использовать трюк spawn () вместо простого fork () /exec ().

ответил akarnokd 14 J000000Tuesday09 2009, 15:50:36
0

Я решил это с помощью JNA: https://github.com/twall/jna

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;

public class prova {

    private interface CLibrary extends Library {
        CLibrary INSTANCE = (CLibrary) Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"), CLibrary.class);
        int system(String cmd);
    }

    private static int exec(String command) {
        return CLibrary.INSTANCE.system(command);
    }

    public static void main(String[] args) {
        exec("ls");
    }
}
ответил kongo09 21 stEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 21 Sep 2011 01:47:12 +0400 2011, 01:47:12
0

Если вы посмотрите на источник java.lang.Runtime, вы увидите, что exec наконец вызовет защищенный метод: execVM, что означает, что он использует виртуальную память. Таким образом, для Unix-подобных систем виртуальная машина зависит от количества пространства подкачки + некоторого соотношения физической памяти.

Ответ Майкла действительно решил вашу проблему, но это может (или сказать, в конечном итоге) вызвать О.С. тупик в вопросе выделения памяти, так как 1 сообщаю О.С. менее осторожны с распределением памяти & 0 просто угадывает & очевидно, что вам повезло, что О.С. думаю, вы можете иметь память в это время. В следующий раз? Хм .....

Лучший подход заключается в том, что вы экспериментируете со своим делом & дать хорошее пространство подкачки & дать лучшее соотношение используемой физической памяти & установите значение 2, а не 1 или 0.

ответил Scott Chu 1 PM000000110000004531 2010, 23:46:45
0

overcommit_memory

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

0 - Эвристическая обработка overcommit. Очевидные нарушения адресного пространства отклоняются. Используется для типичной системы. Это обеспечивает серьезное сбои при распределении, позволяя при избыточной загрузке уменьшить использование подкачки. В этом режиме root может выделить немного больше памяти. Это по умолчанию.

1 - Всегда преувеличивать. Подходит для некоторых научных приложений.

2 - Не переусердствуйте. Общая фиксация адресного пространства для системы не может превышать swap плюс настраиваемый процент (по умолчанию 50) физической памяти. В зависимости от используемого вами процента, в большинстве случаев это означает, что процесс не будет остановлен при попытке использовать уже выделенную память, но при необходимости получит ошибки при выделении памяти.

ответил ricardofunke 21 FebruaryEurope/MoscowbMon, 21 Feb 2011 18:44:38 +0300000000pmMon, 21 Feb 2011 18:44:38 +030011 2011, 18:44:38
0

Вы можете использовать оболочку Tanuki для запуска процесса с порождением POSIX вместо fork. http://wrapper.tanukisoftware.com/doc/english/child-exec.html

  

WrapperManager.exec () является функцией альтернатива Java-Runtime.exec (), у которой есть недостаток в использовании метода fork (), который может сделать на некоторых платформах очень дорогой память для создания нового процесса.

ответил Dan Fabulich 10 PM000000100000005931 2011, 22:45:59
0

Как бы странно это ни звучало, можно обойти эту проблему, чтобы уменьшить объем памяти, выделяемой для JVM. Поскольку fork () дублирует процесс и его память, если вашему процессу JVM на самом деле не нужно столько памяти, сколько выделено через -Xmx, выделение памяти для git будет работать.

Конечно, вы можете попробовать другие решения, упомянутые здесь (например, чрезмерную фиксацию или обновление до JVM, в которой есть исправление). Вы можете попытаться уменьшить объем памяти, если вы отчаянно нуждаетесь в решении, которое сохраняет все программное обеспечение без изменений для окружающей среды. Также имейте в виду, что агрессивное снижение -Xmx может привести к появлению OOM. Я бы рекомендовал обновить JDK как долгосрочное стабильное решение.

ответил Deepak Bala 19 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 19 Sep 2012 17:01:40 +0400 2012, 17:01:40

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132