2014-12-07 1 views
12

내가Leiningen이 자체 JVM을 계속 실행하는 이유는 무엇입니까?

lein trampoline repl 

Leiningen는 다음 REPL에 대해 별도의 JVM을 시작하고 종료 자신의 JVM 프로세스를 실행 호출하는 경우. 그러나 기본값을 호출하면

lein repl 

두 개의 JVM이 실행됩니다. 최초의 Leiningen JVM 프로세스를 계속 실행해야하는 이유가 있습니까? lein trampoline 동작을 기본값으로 설정하고 매번 종료하지 않으시겠습니까?

+0

네임 스페이스 분리? http://www.flyingmachinestudios.com/programming/lein-trampoline/ – nha

+0

프로세스 트리가 깨져서, 린 프로세스를 시작한 부모 프로세스에 문제가 발생했을 때 프로세스가 정리되는 것을 방지 할 수 있습니다. – NielsK

+0

lein이 별도의 JVM을 시작하는 이유는 분명합니다. 그렇게해야 할 이유가 많이 있습니다. 전체 JVM을 계속 실행하는 이유는 무엇입니까? –

답변

6

lein help trampoline 상태 :

이 Leiningen의 내부 프로젝트의 JVM을 중첩하지 않고 작업을 실행합니다.

는 주어진 작업을위한 프로젝트의 프로세스에서 실행하는 Clojure의 코드를 계산하고 Leiningen 자신의 JVM 프로세스를 실행하기보다는 Leiningen의 JVM의 서브 프로세스를 시작 전에 종료 할 수 있습니다.

메모리를 절약하거나 표준적인 문제를 해결하려면이 옵션을 사용하십시오.

인수 : ([작업 이름 & 인수는]) trampoline없이

그래서 당신이 볼 수있는, 두 번째 JVM은 최초의 서브 프로세스로 실행됩니다. 이것이 첫 번째가 나갈 수없는 이유입니다.

한편, trampoline으로 첫 번째 JVM은 보조 스크립트를 구성하여 lein 스크립트에 의해 실행되어 두 번째 JVM을 생성합니다. 따라서이 경우 두 번째 JVM은 lein 스크립트의 하위 항목입니다. How Clojure Babies are Made: Leiningen's Trampoline은 이것을 아주 자세히 설명합니다.

trampoline이 기본값이 아닌지에 대해서는 확실하지 않습니다. 그러나 모든 lein 명령이 프로젝트 코드를 실행하는 것은 아니므로 모든 명령에 두 번째 JVM이 필요하지 않음을 기억하십시오.

또한 trampoline을 사용하면 단점이있을 수 있습니다. 예를 들어, 위의 문서에서 다음 코드 줄에서 살펴 : 나에게

# Just don't change :target-path in project.clj, mkay? 
TRAMPOLINE_FILE="target/trampolines/$INPUT_CHECKSUM" 

, 즉 :target-pathproject.clj 세트 인 경우 문제가있을 수 있음을 의미한다.

+0

현상금을 시작하면서, 나는'lein'이 기본적으로 주 프로세스를 종료하지 않는 이유에 대해 더 많은 추론을하기를 희망했습니다. 개인적으로 필자는'lein' 팀이'trampoline'을 추가하여 성능을 향상 시켰지만 결코 증명할 수는 없지만'lein'의 기본 동작을 충분히 신뢰할 수 있다고 생각합니다. 어쨌든, 당신의 대답은 최고의 것이고이 현상금을받을 가치가 있습니다. –

0

이것은 첫 번째 인스턴스가 환경을 설정하고 다른 필수 매개 변수를 실행중인 실제 jvm으로 전달하기 때문입니다.

JVM의 첫 번째 인스턴스는 사용자가 쉽게 사용할 수있는 일종의 래퍼입니다. 그렇지 않으면 사용자는 모든 실행 지점에서 필요한 매개 변수를 전달하는 모든 작업을 수행해야합니다. 이는 사용자에게 친숙하지도 않고 보안 관점에서도 좋지 않습니다.

+3

왜 '린 트램펄린'행동을 기본값으로 만들고 매번 그만 둘까요? –

+0

질문을 읽어보십시오. –

+0

글쎄,이 질문은 명시 적으로 "원래 Leiningen JVM 프로세스를 계속 실행하는 이유가 있습니까?"라고 묻습니다. 이 대답을하는 것, 안돼? –

관련 문제