Плагин SonarJava для SonarQube содержит несколько правил, основанных на механизме Символическое выполнение (SE), выполняемом во время анализа (особенно, если вы используете профиль качества SonarWay ). Судя по вашим логам, это корень OOME.
Этот механизм позволяет некоторым правилам обнаружения ошибок SonarJava находить проблемы в зависимости от возможного пути выполнения внутри методов (в некоторых случаях также после вызова методов для других методов).
Этот двигатель очень ресурсоемкий. Он генерирует график возможных состояний программы (называемый детализированный график ), имитируя все пути выполнения метода в соответствии с некоторыми ограничениями. Этот размер графика зависит от множества факторов. В то время как сложность тела метода одна (количество условий, циклов и т. Д.), Другая представляет собой количество параметров, поскольку оно представляет как можно больше начальных точек для анализа.
Теоретически, новый разнесенный граф перезапускается для каждого файла, и память освобождается. Хотя все правила, основанные на механизме SE, используют один и тот же график для выявления проблем с данным файлом, взрыв в памяти все же может произойти, если график становится неожиданно слишком большим.
Итак, у вас есть несколько вариантов:
- Попробуйте увеличить объем памяти, доступной для вашего анализа. Надеемся, что это позволит механизму SE покрыть все состояния и завершить выполнение.
- Исключить из файлов анализа, которые могут иметь конструкторы или методы с большим количеством параметров (начиная с 15-20, я ожидаю, что двигатель начнет сильно страдать). Как правило, рекомендуется избегать анализа сгенерированного кода.
- В конечном итоге отключите все правила, использующие движок SE. В этой папке вы найдете ключ правила: SonarSource / sonar-java /.../ se / check (посмотрите аннотации
@Rule()
, чтобы получить ключ правила)
В идеале, если бы вы могли изолировать исходный код, систематически воспроизводящий проблему, и извлечь отдельный фрагмент кода (компилируя только с использованием собственных классов Java и без внешних зависимостей), это очень помогло бы выявить потенциальную утечку памяти в двигатель, или определите некоторую эвристику, чтобы не тратить время на методы / конструкторы, которые двигатель все равно не сможет завершить.