Я пытаюсь понять, как 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))))