2014-12-07 18 views
12

Se chiamoPerché Leiningen mantiene attiva la propria JVM?

lein trampoline repl 

Leiningen lancia il suo proprio processo JVM che poi inizia una JVM separata per il repl e si chiude. Tuttavia, chiamando il valore predefinito

lein repl 

lascia in esecuzione due JVM. C'è qualche ragione per mantenere in esecuzione il processo JVM Leiningen originale? Perché non rendere il comportamento lein trampoline l'impostazione predefinita e uscire ogni volta?

+0

separazione spazio dei nomi? http://www.flyingmachinestudios.com/programming/lein-trampoline/ – nha

+0

Ciò interromperà l'albero del processo, impedendo la pulizia dei processi quando accade qualcosa al processo padre che ha avviato lein. – NielsK

+0

È perfettamente chiaro perché 'lein' avvia una JVM separata, ci sono molte ragioni per farlo. Dal perché mantenere la JVM originale in esecuzione per tutto il tempo? –

risposta

6

lein help trampoline stati:

eseguire un compito senza nidificazione JVM del progetto all'interno di Leiningen.

Calcola il codice Clojure per eseguire nel processo del progetto per la determinato compito e permette proprio processo JVM di Leiningen per uscire prima di esecuzione, piuttosto che lanciare un sottoprocesso di JVM di Leiningen.

Da utilizzare per risparmiare memoria o per aggirare i problemi di stdin.

Argomenti: ([task-name & args])

Così si può vedere, senza trampoline la seconda JVM corre come un sotto-processo del primo. Ecco perché il primo non può uscire: l'uscita interromperebbe il secondo.

D'altra parte, con trampoline il primo JVM costruisce uno script di shell che viene quindi eseguito dallo script per generare la seconda JVM. Quindi, in questo caso, la seconda JVM è figlia dello script lein. How Clojure Babies are Made: Leiningen's Trampoline copre questo aspetto in modo abbastanza dettagliato.

Per quanto riguarda il motivo per cui trampoline non è l'impostazione predefinita, non sono del tutto sicuro. Ma ricorda che non tutti i comandieseguono il codice del progetto, quindi la seconda JVM non è necessaria per ogni comando.

Inoltre, potrebbero esserci degli svantaggi nell'uso di trampoline. Ad esempio, date un'occhiata alle seguenti righe di codice dal suddetto articolo:

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

Per me, questo implica che ci potrebbero essere problemi se :target-pathè set in project.clj.

+0

Avvio del bounty, speravo di vedere qualche altro ragionamento sul perché 'lein' non stia chiudendo il suo processo principale di default. Personalmente, credo che il team di 'lein' abbia aggiunto' trampolino' per migliorare le sue prestazioni, ma non ci si è mai fidato abbastanza da renderlo il comportamento predefinito di 'lein', anche se non ho nulla da dimostrare. Ad ogni modo, la tua risposta è la migliore e meriti questa grazia. –

0

Questo perché la prima istanza imposta l'ambiente e passa altri parametri necessari alla jvm reale che continua a essere in esecuzione.

prima istanza di JVM è solo una sorta di involucro, che è per gli utenti facilità, altrimenti utente ha a che fare tutti coloro che il lavoro di passare i parametri richiesti in ogni punto exeution, che né facile da usare e non guarda bene dal punto di vista della sicurezza.

+3

Perché non rendere il comportamento di 'lein trampoline' il default e uscire ogni volta? –

+0

Leggi la domanda per favore. –

+0

Bene, la domanda chiede esplicitamente: "C'è qualche motivo per mantenere in esecuzione il processo JVM Leiningen originale?". Questo sembra rispondere, no? –

Problemi correlati