Как в персоне реализована постоянная функция JVM? - PullRequest
5 голосов
/ 14 января 2011

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

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

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

 (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))))

Ответы [ 2 ]

4 голосов
/ 14 января 2011

Cake имеет скрипт Ruby, который запускается и управляет JVM.В Ruby нет накладных расходов JVM, поэтому сценарий Ruby может создавать JVM, а затем при выполнении команд сценарий Ruby передает эти команды JVM.

Причина, по которой две JVM были необходимы, заключалась в том, чтоЗависимости Cake (Cake JVM) были отделены от зависимостей проекта (Bake JVM).Некоторые команды, такие как cake repl, запускаются в bake JVM, чтобы воспользоваться преимуществами пути к классам проекта.

Однако в самой последней версии для каждого проекта существует только одна JVM.Это возможно при использовании разных загрузчиков классов в одной и той же JVM.Соответствующая используемая библиотека: classlojure .

Даже с двумя версиями JVM JVM были постоянными, то есть они порождались только один раз, а затем перезапускались только в случае крайней необходимости, как в случаеизмененный путь к классу (когда вы добавляете новую зависимость или что-то подобное).Я не уверен, почему вы думаете, что это будет означать накладные расходы JVM каждый раз при выполнении команды.Идея состоит в том, что многие команды выполняются мгновенно, а не каждая команда, запускающая JVM.

2 голосов
/ 15 января 2011

Рейнес прав.Начиная с версии 0.6.0, на проект приходится одна JVM.Cake запускается в главном загрузчике классов и использует classlojure для загрузки проекта в отдельный загрузчик классов и перезагрузки его при изменении пути к классам.Мы обсудили глобальный параметр ~ / .cake / config для совместного использования единой JVM среди всех проектов.Не должно быть слишком сложно добавить это, используя classlojure.Основная проблема с этим подходом заключается в том, как разделить плагины задач для тортов.Возможно, глобальный торт-проект мог бы выполняться в главном загрузчике классов, и каждый проект мог бы получить два загрузчика классов (один для торта и один для проекта).

Что касается собственных зависимостей, classlojure не поддерживает добавление их после JVMзапускает.Патч для добавления этой функции приветствуется, если путь к собственной библиотеке является локальным для определенного загрузчика классов и не используется всеми загрузчиками классов в одной JVM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...