Как в cake реализована функция постоянных JVM?

Я пытаюсь понять, как cake реализует свой подход с несколькими JVM. На высоком уровне я думал, что cake работает аналогично nailgun, где есть один экземпляр JVM (один процесс JVM), а новые «JVM» для разных проектов на самом деле просто clojure / jars, оцениваемые в новом загрузчике классов (вместе с различные зависимости jar), что, на мой взгляд, не является новым экземпляром JVM. Из В чем разница между Cake и Leiningen? Однако подразумевается, что существует несколько JVM (одна для торта и * для проектов), а не только один экземпляр JVM.

Если создаются новые экземпляры JVM, откуда взялось ускорение? Насколько я понимаю, я могу предположить, что запуск новой JVM подразумевает создание нового процесса JVM, который, как и обычно, требует таких же накладных расходов при запуске.

Если нет, как добавляются собственные зависимости? Насколько я понимаю, JVM знает о собственных зависимостях только из аргументов командной строки, переданных до выполнения. Единственный способ, которым я знаю, как обойти это, - это использовать хакерскую программу для Sun / Oracle JVM, указанную ниже.

 (let [clazz java.lang.ClassLoader
      field (.getDeclaredField clazz "sys_paths")] 
   (.setAccessible field true)
   (.set field clazz nil)
   (System/setProperty "java.library.path" (apply str (interpose ";" native-paths))))

5
задан Community 23 May 2017 в 12:07
поделиться