2015-09-22 3 views
0

У меня есть одно приложение java, которое создает дочерние JVM для выполнения некоторых действий. Детский процесс выглядит так же, как и родительский, включая все аргументы.jvm forking дубликат ребенка спорадически

Чтобы подтвердить родительский, i проверенный идентификатор родителя и его всегда оригинальную JVM.

Приложение работает как простой Java-процесс, то есть не на любом сервере, таком как apache, weblogic и т. Д. Поскольку процессы имеют одинаковые аргументы, оба записывают в одни и те же файлы журналов, а открытые файлы - одни и те же.

Это новое поведение, которого раньше не было. Может кто-то предоставить ключ вокруг того, чтобы проверить, чтобы найти причину

JVM версии: - OpenJDK Runtime Environment (IcedTea 2.5.6) (7u79-2.5.6-0ubuntu1.14.04.1) ОС: Ubuntu 14,04

+0

Не могли бы вы добавить несколько подробнее? Как вы наблюдали детский процесс? Что делает ваш java-процесс, создает ли он какие-либо потоки или вызывает внешние двоичные файлы, как указывает @David? – mabi

+1

У меня есть setUp оповещения для мониторинга процесса, который догнал дополнительный ходовой процесс. Я не называю нечто вроде exec, но использую много разных threadPools. ThreadPools были там раньше, но начали получать вопрос сейчас – ondway

+0

Мы вызывали tar через Processbuilder, который зависал в forkAndExec. Вилка была успешной, поэтому можно было увидеть процесс Java, но не exec. его получить повесить на близком syscall для основного времени – ondway

ответ

0

Одна из возможностей - это явный вызов метода Runtimeexec.

Что-то вроде следующего:

Process process = Runtime.getRuntime().exec("java -jar myApp.jar"); 

Это позволит создать новый дочерний процесс основного процесса.

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

0

Мы вызывали tar через Processbuilder, который зависал в forkAndExec. Вилка была успешной, поэтому можно было увидеть процесс Java, но не exec. его получение зависает при закрытии syscall в основное время из-за большого количества операций с дисками.