Как выделить меньше памяти для Scala с IntelliJ - PullRequest
0 голосов
/ 27 февраля 2019

Я пытаюсь аварийно завершить работу моей программы (запущенной в IntelliJ) с OutOfMemoryException:

  def OOMCrasher(acc: String): String = {
    OOMCrasher(acc + "ADSJKFAKLWJEFLASDAFSDFASDFASERASDFASEASDFASDFASERESFDHFDYJDHJSDGFAERARDSHFDGJGHYTDJKXJCV")
  }
  OOMCrasher("")

Однако она просто работает очень долго.Я подозреваю, что на заполнение всех гигабайт памяти, выделенной JVM, строкой уходит очень много времени.Поэтому я смотрю, как заставить IntelliJ выделять меньше памяти для JVM.Вот что я пробовал:

В конфигурации запуска -> Параметры виртуальной машины:

 --scala.driver.memory 1k || --driver.memory 1k

Обе эти причины вызывают сбои:

Unrecognized option: --scala.driver.memory
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

Я такжепопытался выставить опции в Редактировать конфигурации -> Аргументы программы.Это приводит к тому, что программа снова запускается в течение очень долгого времени, не давая OutOfMemoryException.

РЕДАКТИРОВАТЬ:

Я приму любой ответ, который успешно объясняет, как выделить меньше памяти для программы, поскольку это основной вопрос.

ОБНОВЛЕНИЕ:

Изменение функции на:

  def OOMCrasher(acc: HisList[String]): HisList[String] = {
    OOMCrasher(acc.add("Hi again!"))
  }
  OOMCrasher(Cons("Hi again!", Empty))

, где HisList - простая реализация LinkedList, а также запуск с-Xmx3m вызвал разыскиваемое исключение.

1 Ответ

0 голосов
/ 27 февраля 2019

К функционально достичь OutOfMemoryException сложнее, чем кажется, потому что рекурсивные функции почти всегда вначале сталкиваются с StackOverflowException.

Но существует изменчивый подход, который гарантируетOutOfMemoryException: удваивание List снова и снова.List в Scala не ограничены максимальным размером массива и поэтому могут расширяться до тех пор, пока не останется больше памяти.

Вот пример:

def explodeList[A](list: List[A]): Unit = {
  var mlist = list

  while(true) {
    mlist = mlist ++ mlist
  }
}

Чтобы ответить на ваш актуальный вопроспопробуйте поиграть с опцией JVM -Xmx___m (например, -Xmx256m).Это определяет максимальный размер кучи, которую JVM может выделить.

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