2011-12-07 2 views
3

명령 줄에서 특정 프로세스를 직접 시작하면 2-3 초 후에 완전히 시작됩니다.Java process.start는 부모가 실행 후 소멸되지 않으면 극도로 속도가 느려집니다.

자바 프로그램에서 똑같은 명령으로 똑같은 프로세스를 시작하면 부모 프로세스가 삭제되지 않으면 시작될 때 중단됩니다. 왜? Runtime.exec의와

ProcessBuilder pb = new ProcessBuilder(cmd); 
pb.directory(new File(dir)); 
Process p = pb.start(); 

: ProcessBuilder를 가진

Runtime.getRuntime().exec(cmd, null, new File(dir)); 
내가 바로 가비지 컬렉터를 null에 전화를 새로운 프로세스를 새로운 프로세스 개체를 설정하지 않으면

어느 쪽이든 3 초 안에해야 할 것과 동일한 일을하기 위해 최대 3 분이 걸립니다.

Process p = pb.start(); 
p = null; 
Runtime.getRuntime().gc(); 

위의 코드를 사용하면 문제가 해결됩니다. 누군가 왜 나를 설명 할 수 있을까요? 프로세스 처리와 관련된 JVM과 관련이 있다고 생각하지만 이는 단지 추측에 불과합니다.

새로운 프로세스는 Hibernate를 사용하여 MySQL DB에 연결하고 log4j로 로그 파일을 작성하며 .properties 파일에서 읽고 RabbitMQ 서버에 연결합니다.

바로 얻을 악명 까다 롭습니다 자바 애플리케이션에서 외부 프로그램을 실행

좋은 일

답변

1

가, 감사합니다.

고품질 Apache Commons Exec library을 사용하는 것이 좋습니다.

코드에 종속성을 추가하지 않으려면 적어도 Exec library's Java code을보고 프로세스가 어떻게 생성되고 실행되는지 확인하십시오.

+1

감사합니다. 그러나 대안을 찾고있는 것이 아닙니다. 왜 그런지 궁금합니다. – grog

0

자식 프로세스에 stdin의 입력이 필요합니까? 따라서 입력이 p.getOutputStream()에 의해 제공 될 때까지 중단됩니다. write()

또는 stdout이 소비 될 때까지 기다릴 수 있습니다.

+0

아니요, "java -jar .jar file.properties"로 프로그램을 실행합니다. 입력 요청이 없습니다. – grog