Как зайти в Даркнет?!
25th January, 01:11
8
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
899
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
952
0
Очень долго работает Update запрос Oracle
27th January, 09:58
916
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
907
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
942
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1727
0
период по дням
25th October, 10:44
3957
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3722
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4614
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4382
0
Помогите пожалуйста решить задачи
24th November, 23:53
6087
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4352
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4400
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Ant в задач бросает StackOverflowException
Я пытаюсь скомпилировать более 100 java классов из разных пакетов с чистого листа каталог (без инкрементных компиляций), использующий следующие задачи ant:
<target name="-main-src-depend">
<depend srcdir="${src.dir}"
destdir="${bin.dir}"
cache="${cache.dir}"
closure="true"/>
</target>
<target name="compile" depends="-main-src-depend"
description="Compiles the project.">
<echo>Compiling</echo>
<javac target="${javac.target}"
source="${javac.source}"
debug="${javac.debug}"
srcdir="${src.dir}"
destdir="${bin.dir}">
<classpath>
<path refid="runtime.classpath"/>
<path refid="compile.classpath"/>
</classpath>
</javac>
</target>
Однако при первом запуске задачи компиляции я всегда получаю StackOverflowException. Если я снова запускаю задачу, компилятор выполняет инкрементную сборку, и все работает нормально. Это нежелательно, так как мы используем CruiseControl для выполнения автоматической ежедневной сборки, и это вызывает ложные сбои сборки.
В качестве решения quick-and-dirty я создал 2 отдельные задачи, компилируя части проекта в каждой. Я действительно не думаю, что это решение будет работать, поскольку в будущем будет добавляться больше классов, и я не хочу добавлять новые задачи компиляции каждый раз, когда мы попадаем в "compile limit".
Это будет приятно узнать; что же может
причина или причины a StackOverflowError
во время компиляции кода Java?
Это будет приятно узнать; что же может причина или причины a StackOverflowError во время компиляции кода Java?
Вполне вероятно, что вычисление длинного выражения в вашем файле java потребляет много памяти, и поскольку это делается в сочетании с компиляцией других классов, то VM просто исчерпывает пространство стека. Ваш сгенерированный класс, возможно, раздвигает законные пределы для своего содержания. См. главу 4.10 ограничения виртуальной машины Java в спецификации виртуальной машины Java, второе издание .
Исправление 1: рефакторинг класса
Поскольку ваш класс создается, это может быть не вариант. Тем не менее, стоит посмотреть на варианты, которые предлагает ваш инструмент генерации классов, чтобы увидеть, может ли он произвести что-то менее хлопотное.
Исправление 2: Увеличьте размер стека
Я думаю, что у Кирона есть одно решение, когда он упоминает аргумент -Xss. javac принимает ряд нестандартных аргументов, которые будут различаться между версиями и поставщиками компиляторов.
Мой компилятор:
$ javac -version
javac 1.6.0_05
Чтобы перечислить все опции для него, я бы использовал следующие команды:
javac -help
javac -X
javac -J-X
Я думаю , что предел стека для javac составляет 512 КБ по умолчанию. Вы можете увеличить размер стека для этого компилятора до 10 МБ с помощью этой команды:
javac -J-Xss10M Foo.java
Вы могли бы передать это в файле Ant с элементом compilerarg, вложенным в вашу задачу javac .
<javac srcdir="gen" destdir="gen-bin" debug="on" fork="true">
<compilerarg value="-J-Xss10M" />
</javac>
<javac srcdir="gen" destdir="gen-bin" debug="on" fork="true">
<compilerarg value="-J-Xss10M" />
</javac>
<javac srcdir="gen" destdir="gen-bin" debug="on" fork="true">
<compilerarg value="-J-Xss10M" />
</javac>
из приведенного выше комментария следует, что это неверно. Вам нужно пространство между-J и-X, вот так:
<javac srcdir="gen" destdir="gen-bin" debug="on" fork="true">
<compilerarg value="-J -Xss10M" />
</javac>
чтобы избежать следующей ошибки:
[javac]
[javac] The ' characters around the executable and arguments are
[javac] not part of the command.
[javac] Files to be compiled:
...
[javac] javac: недопустимый флаг: -J-Xss1m [javac] использование: javac
Попробуйте добавить некоторые вариации этих атрибутов в строку задачи Ant javac :
memoryinitialsize="256M" memorymaximumsize="1024M"
Вы также можете попробовать fork="true" , не уверен, что это позволит вам установить значения для стека и кучи (aka-Xm1024), но это может помочь (если это будет работать из командной строки, но не в Ant).
[Редактировать]:
Добавленная ссылка -- страница задачи javac , по-видимому, предполагает, что приведенные выше параметры требуют, чтобы вы также установили fork="true" .
Вот что я нашел.
После публикации моего вопроса я пошел дальше и изменил задачу компиляции с атрибутами fork="true", memoryinitialsize="256m" и memorymaximumsize="1024m" (сегодня я обнаружил, что это было предложено Kieron и jmanning2k, спасибо за ваше время). Тем не менее это не решило проблему.
Я решил начать удалять классы из исходного дерева, чтобы посмотреть, может ли a точно определить проблему. Оказывается, у нас был клиентский класс веб-службы для Axis 1.4 , который был автоматически сгенерирован из файла WSDL. Теперь этот класс-монстр (как в Франкенштейне), он имеет 167 членов поля (все они типа String), 167 пар getter/setter (по 1 для каждого поля), конструктор, который получает все 167 полей в качестве параметров, метод equals, который сравнивает все 167 полей странным образом. Для каждого поля сравнение идет следующим образом:
(this.A == null && other.getA() == null) || (this.A != null && this.A.equals(other.getA()))
Результатом этого сравнения является "anded" (&&) с результатом сравнения следующего поля и так далее. Класс продолжает работу с методом hashCode, который также использует все поля, некоторые пользовательские методы сериализации XML и метод, который возвращает объект метаданных для конкретной оси, описывающий класс и также использующий все члены поля.
Этот класс никогда не изменяется, поэтому я просто помещаю скомпилированную версию в приложение classpath и проект компилируется без проблем.
Теперь я знаю, что удаление этого единственного исходного файла решило проблему. Однако я совершенно не представляю, почему именно этот класс вызвал эту проблему. Было бы неплохо узнать, что может вызвать или вызывает StackOverflowError при компиляции кода Java? Я думаю, что напишу этот вопрос.
Для интересующихся:
- Windows XP С ПАКЕТОМ ОБНОВЛЕНИЯ 2
- SUN - е JDK 1.4.2_17
- Ant 1.7.0
Это довольно странно, 100 классов на самом деле не так уж много. Что делает компилятор, когда стек переполняется? Есть ли полезный стек trace сгенерированный? Что произойдет, если вы запустите javac непосредственно в командной строке вместо thorugh ant?
Одним из возможных обходных путей является простое увеличение размера стека с помощью аргумента -Xss до JVM; либо до JVM, выполняющего ant , либо путем установки fork="true" и <compilerarg> в задаче <javac> . На самом деле теперь, когда я думаю об этом, исчезает ли проблема, просто вставляя fork="true" ?