Arhn - архитектура программирования

Система JNA() избегает форка

Я пытаюсь найти альтернативу Java Runtime.exec(), которая не использует вилку. Проблема в том, что наша JVM потребляет большую часть памяти, и вилка Runtime.exec в этом процессе может вызвать проблемы с памятью, даже с копированием при записи и перегрузкой (что часто обсуждалось в stackoverflow, см. Java Runtime.getRuntime().exec() альтернативы).

В другом сообщении stackoverflow было предложено решение с использованием JNA, однако комментариев к этому решению не было, и оно не получило высокой оценки: Как решить java.io.IOException: error=12, невозможно выделить память, вызывая Runtime#exec()?

Аналогичное решение JNA было предложено здесь: http://sanjitmohanty.wordpress.com/2011/12/20/overcoming-runtime-exec-havoc-with-jna/

Мой вопрос: предотвращает ли использование JNA для выполнения системного вызова вилку и последующие проблемы с выделением памяти, которые может вызвать вилка? Вот код, который я использую:

public class TestJNA {
 private interface CLibrary extends Library {
    CLibrary INSTANCE = (CLibrary) Native.loadLibrary("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");
 }
24.05.2012

Ответы:


1

Возможно нет. Реализация system(), которую вы вызываете, почти наверняка использует саму fork() — реализация C будет выглядеть примерно так:

int system(const char *cmd) {
    if (fork() == 0) {
        execl("/bin/sh", "-c", cmd);
        _exit(1);
    }
    int result;
    wait(&result);
    return WEXITSTATUS(result);
}

Более приемлемым решением было бы поддерживать линии связи (например, каналы) с небольшим внешним процессом, который может порождать для вас подпроцессы. Android делает что-то очень похожее; внешний процесс известен как «зигота».

24.05.2012
  • спасибо за предложение об использовании небольшого внешнего процесса. Я использую tcpserver из ucspi-tcp для прослушивания соединений сокетов с Java. Для меня tcpserver запускает процессы оболочки. Работает как шарм и делает мою память более предсказуемой. 24.05.2012
  • Если вы используете TCP, убедитесь, что он доступен только локально и не подвергается воздействию процессов с более низкими уровнями привилегий. 24.05.2012

  • 2

    Нет. Для выполнения fork (или аналогичный), и JNA ничего не может с этим поделать.

    Я не думаю, что люди предлагают вам использовать JNA для вызова system, а скорее для выполнения реальных системных вызовов. Например, в этом блоге в качестве примеров приведены chmod и chown. Итак, используя ваш пример, вместо использования JNA для вызова system('ls') вызовите opendir и readdir (конечно, то же самое относится к тому, что вы действительно вызываете).

    Возможно, вам придется создать DLL, чтобы обернуть желаемую функциональность.

    24.05.2012

    3

    Невозможно выполнить «систему» ​​без fork().

    24.05.2012

    4

    Тогда как работает system()? если он все еще использует вилку? у меня была проблема с этой ошибкой "java.io.IOException: ошибка = 12, не удается выделить память", и это решило ее для меня:

    private interface CLibrary extends Library {
                CLibrary INSTANCE = (CLibrary) Native.loadLibrary(("c"), CLibrary.class);
            int system(String cmd);
        }
    
        private static int exec(String command) {
            return CLibrary.INSTANCE.system(command);
        }
    
    26.12.2013
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..