Плагин Scala maven не компилируется с StackOverflowError

Я нашел ошибку, связанную с Scala-maven-plugin в моем проекте Maven. У меня есть очень длинная последовательность функций (для целей машинного обучения), которую я закодировал вручную (74 элемента).

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

Для получения дополнительной информации, вот окончательный результат моей компиляции:

[ERROR] Failed to execute goal net.alchim31.maven:scala-maven-plugin:3.3.1:compile (default) on project SecretProject: wrap: org.apache.commons.exec.ExecuteException: Process exited with an error: 240 (Exit value: 240) -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

Плюс самое начало StackTrace:

[INFO] Compiling 13 source files to /home/belka/Bureau/SecretProject/target/classes at 1513759339071
[ERROR] error: java.lang.StackOverflowError
[INFO]  at scala.reflect.internal.TreeInfo.isSelfConstrCall(TreeInfo.scala:296)
[INFO]  at scala.reflect.internal.TreeInfo.isSelfOrSuperConstrCall(TreeInfo.scala:344)
[INFO]  at scala.reflect.internal.Trees$UnderConstructionTransformer$class.transform(Trees.scala:1701)
[INFO]  at scala.tools.nsc.transform.ExplicitOuter$OuterPathTransformer.transform(ExplicitOuter.scala:291)
[INFO]  at scala.tools.nsc.transform.ExplicitOuter$ExplicitOuterTransformer.transform(ExplicitOuter.scala:457)
[INFO]  at scala.tools.nsc.transform.ExplicitOuter$ExplicitOuterTransformer.transform(ExplicitOuter.scala:352)
[INFO]  at scala.reflect.internal.Trees$class.itransform(Trees.scala:1345)

(измененное название проекта)

  • Кто-нибудь сталкивался с подобной проблемой с Scala-maven-plugin?
  • Имеет ли синтаксический анализатор Scala-maven-plugin (в компиляторе) какие-либо жесткие ограничения для синтаксического анализа последовательностей?
  • Как это решить и скомпилировать мой проект?
  • Почему это работает с компиляцией IntelliJ (кнопка «воспроизведение»), но не с компиляцией Maven?

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

Я добавляю фрагмент pom.xml, содержащий мой фрагмент Scala-maven-plugin:

      <plugin>
        <!-- see http://davidb.github.com/scala-maven-plugin -->
        <groupId>net.alchim31.maven</groupId>
        <artifactId>scala-maven-plugin</artifactId>
        <version>3.3.1</version>
        <executions>
          <execution>
            <goals>
              <goal>compile</goal>
              <goal>testCompile</goal>
            </goals>
            <configuration>
              <args>
                <arg>-dependencyfile</arg>
                <arg>${project.build.directory}/.scala_dependencies</arg>
              </args>
              <jvmArgs>
                <jvmArg>-Xms512m</jvmArg>
                <jvmArg>-Xmx4096m</jvmArg>
              </jvmArgs>
            </configuration>
          </execution>
        </executions>
      </plugin>

person belka    schedule 20.12.2017    source источник
comment
Какая у вас ошибка? Пожалуйста, приведите небольшой пример, воспроизводящий проблему.   -  person marstran    schedule 20.12.2017
comment
Я добавил информацию о трассировке стека + чтобы воспроизвести проблему, вы можете создать Sequence, содержащий 74 элемента, добавленных вручную, тогда на 75-м он больше не должен компилироваться.   -  person belka    schedule 20.12.2017
comment
Я попытался создать последовательность из 200 элементов, добавленных вручную, и это сработало. Пожалуйста, предоставьте минимальный, проверяемый и полный пример, чтобы мы могли воспроизвести вашу проблему.   -  person marstran    schedule 20.12.2017
comment
Спасибо за ваш ответ и за ваше время. Можете ли вы предоставить мне свою версию jdk? Вы пробовали компилировать с помощью maven?   -  person belka    schedule 20.12.2017
comment
Можете поделиться фрагментом pom.xml с конфигурацией scala-maven-plugin?   -  person David Bernard    schedule 20.12.2017
comment
спасибо @DavidBernard, я добавляю это в свой исходный пост.   -  person belka    schedule 20.12.2017
comment
Мы не сможем решить вашу проблему, если вы не предоставите какой-либо код, который ее воспроизводит. Удалите или замените все ссылки на проприетарные материалы, если проблема в них.   -  person marstran    schedule 20.12.2017
comment
Я работаю над удалением проприетарного кода, но это не так просто.   -  person belka    schedule 20.12.2017


Ответы (2)


Ты мог :

  • де-рекурсивный код или используйте хвостовую рекурсию
  • или увеличьте максимальный размер стека jvm, используемого для запуска scalac через -Xss

          <jvmArgs>
            <jvmArg>-Xss4m</jvmArg>
            <jvmArg>-Xms512m</jvmArg>
            <jvmArg>-Xmx4096m</jvmArg>
          </jvmArgs>
    

Я предполагаю, что IDEA уже увеличила максимальный размер стека по умолчанию (iirc 1024k в 64-битной виртуальной машине).

person David Bernard    schedule 20.12.2017
comment
Благодарность! это решило мою проблему. Есть ли у вас какая-либо документация о том, как вы нашли это решение или почему оно решает мою проблему? Почему такого маленького размера кучи достаточно? - person belka; 20.12.2017
comment
Xss для размера стека, Xms/Xmn для размера кучи (4G не является маленьким размером кучи). вы можете искать разницу между размером стека и размером кучи (для jvm). Я нашел решение, потому что у меня уже была эта проблема несколько лет назад со слишком рекурсивным приложением или глючным приложением с бесконечной рекурсией. - person David Bernard; 20.12.2017
comment
и как 4M для размера стека? - person belka; 20.12.2017

Отвечу на ваши вопросы по порядку:

  • Да. См. эту проблему и решение.
  • JVM имеет ограничение на стек, теперь я немного размышляю, но при разборе кода обычно используется стек, и если он рекурсивный (oi vey), имеет смысл, что для анализа очень длинной последовательности потребуется больше памяти стека. По-видимому, при использовании памяти maven и синтаксическом анализаторе scala это слишком много.
  • Чтобы решить эту проблему, см. ссылку выше.
  • Возможно, как я уже упоминал выше, maven потребляет больше памяти стека, чем intellij. Изменить: я думаю, что это, скорее всего, зависит от того, как запускается процесс компиляции, если я не ошибаюсь, у него может быть другое состояние стека.
person Eytan    schedule 20.12.2017
comment
Я видел предложенное решение, однако это не подходит для моей проблемы. Фаза компиляции использует примерно 4-5% моей памяти... - person belka; 20.12.2017
comment
@belka у вас есть доступная память или память размера стека JVM? размер стека ограничен независимо от доступной системной памяти. - person Eytan; 20.12.2017
comment
моей доступной памяти; Размер стека JVM установлен равным 4096M, что намного превышает потребляемую память. - person belka; 20.12.2017
comment
Коррекция @belka 4096M - это не максимальный размер стека, а максимальная память кучи - person David Bernard; 20.12.2017