Как уменьшить Scala (/Java), запускаются наверху?

Другие непосредственно ответили на Ваш вопрос, но при попытке понять стек и "кучу", я думаю, что полезно рассмотреть расположение памяти традиционного процесса UNIX (без потоков и mmap() - базирующиеся средства выделения). веб-страница Глоссария управления памятью имеет схему этого расположения памяти.

стек и "куча" традиционно расположены в противоположных концах виртуального адресного пространства процесса. Стек растет автоматически при доступе, до размера, установленного ядром (который может быть скорректирован с setrlimit(RLIMIT_STACK, ...)). "Куча" растет, когда средство выделения памяти вызывает brk() или sbrk() системный вызов, отображая больше страниц физической памяти в виртуальное адресное пространство процесса.

В системах без виртуальной памяти, таких как некоторые встроенные системы, тот же базовый макет часто применяется, кроме стека и "кучи" фиксируются в размере. Однако в других встроенных системах (таких как те, которые на основе Микрочипа микроконтроллерами PIC), стопка программы является отдельным блоком памяти, которая не адресуема инструкциями по перемещению данных, и может только быть изменена или считана косвенно через инструкции по процессу выполнения программы (вызов, возвратитесь, и т.д.). Другая архитектура, такая как процессоры Intel Itanium, имеет несколько стеков . В этом смысле стек является элементом архитектуры ЦП.

22
задан skaffman 27 November 2011 в 15:28
поделиться

3 ответа

На каком компьютере вы его используете? Очевидно, что при запуске JVM возникают накладные расходы, но они еще больше, если JVM обнаруживает, что вы работаете на машине серверного класса .

В версии 5.0 платформы J2SE класс машины, называемый машиной серверного класса, был определен как машина с:

  • 2 или более физическими процессорами
  • 2 или более гигабайтами физической памяти

Вы можете перевести JVM в режим клиента , используя параметр -client . Клиентский режим настроен на быстрое время запуска.

Существует также переход к модульности JVM (проект Jigsaw ), который еще больше сокращает время запуска - это началось с JDK 1.6.0_10 .

15
ответ дан 29 November 2019 в 05:16
поделиться

See Nailgun

8
ответ дан 29 November 2019 в 05:16
поделиться

Вы можете обойти время запуска JVM, открыв Scala REPL и загрузив свои скрипты прямо в него с помощью команды : load . Это компилирует (это занимает некоторое время, но на практике я не нахожу это долгим) содержимое скрипта и загружает его для использования в REPL. Например:


scala> :load testScript.scala
Loading testScript.scala...
import scala.collection.mutable.Map
memory: scala.collection.mutable.Map[Int,Int] = Map()
fib: (Int)Int
res7: Int = 165580141

scala> fib(10)
res1: Int = 55

scala> fib(11)
res2: Int = 89

scala> fib(12)
res3: Int = 144

scala> fib(13)
res4: Int = 233

Например, мой типичный рабочий процесс при написании различных прототипов на Scala выглядит следующим образом. У меня в одном окне открыт текстовый редактор, а в другом - Scala REPL. Я пишу свой код, а затем загружаю его (: load script.scala ). Результаты, полученные с помощью сценария, становятся доступны немедленно (как видно из приведенной выше записи, res7 ), также доступны любые функции, классы или объекты, определенные в сценарии. И это быстрее, чем запуск scala myScript. scala , поскольку JVM уже загружена.

Если вы идете по скомпилированному маршруту, используйте fsc (быстрый компилятор Scala). При первом вызове он создает процесс-демон, который компилирует код. Поэтому вам нужно будет заплатить стартовую цену JVM только один раз. Просто обратите внимание, что если вы измените значение CLASSPATH (переменная среды), вам придется перезапустить fsc (это то, что меня беспокоило некоторое время).

- Flaviu Cipcigan

8
ответ дан 29 November 2019 в 05:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: