Size: a a a

2021 January 05

AE

Alexandr Emelyanov in pro.jvm
Dmitry Zvorygin
где начинаются изменения - с того модуля и начинал бы
Мне кажется это плохая идея, в каждом модуле между релизами очень много изменений
источник

AE

Alexandr Emelyanov in pro.jvm
Да и без знания исходников пытаться смотреть бесполезно
источник

DZ

Dmitry Zvorygin in pro.jvm
Я обычно так делаю, и помогает. Заодно мозги в тонусе держатся.
источник

DZ

Dmitry Zvorygin in pro.jvm
Естественно надо качать всё в гите, ну и git annotate твой лучший друг
источник

AG

Alexey Genus in pro.jvm
Nikita Gryzlov
Всем привет! Никто не сталкивался с деградацией производительности при апгрейде spring boot с 2.3.5 до 2.4.1?
Суть - есть консольное спринг-бут приложение, только базовый стартер, environment=none. есть интерфейс, у которого ~150 реализацией, проаннотированных как
@Component
@Primary
@Scope("prototype")

Есть конфигурация, выступающая своего рода object provider, получающая инстанс _конкретного_ класса:
@Configuration
@RequiredArgsConstructor
public class DiagnosticConfiguration {

 private final ApplicationContext applicationContext;

 @Bean
 @Scope("prototype")
 public <T extends BSLDiagnostic> T diagnostic(Class<T> clazz) {
   return applicationContext.getBean(clazz);
 }

}

На 2.3.5 ~15000 инстанцирований бинов (разных типов) через конфигурацию занимало 12 секунд чистого процессорного времени. Простой апгрейд до 2.4.1 увеличивает это время до 75+ секунд. На flame graph видно, что львиную долю стал занимать CommonAnnotationBeanPostProcessor.postProcessProperties(PropertyValues, Object, String), хотя на 2.3.5 он вообще в flame graph не показывался.

Что изменилось? Куда можно покопать?

flame graph с проблемным местом:
https://i.postimg.cc/JhNfXY50/image.png
Версия java случайно заодно не менялась? Flamegraph пустой какой-то, а это, мне кажется, значит, что тормоз находится в synchronized-блоке там
источник

b

borsch in pro.jvm
привет

здесь есть контрибюторы в open-api-generator? у меня возникают проблемы при генерации кода для samples.
после генерации на винде все / превращаются в \\ хотя никаких изменений в самом файле нету. если запускаю кодогенерацию в docker'e, то вылезает проблема с clrf -> lf. если в докере пробовать подставить line.separator, чтоб генерить как-бы под виндой, то билд просто падает
источник

AE

Alexandr Emelyanov in pro.jvm
borsch
привет

здесь есть контрибюторы в open-api-generator? у меня возникают проблемы при генерации кода для samples.
после генерации на винде все / превращаются в \\ хотя никаких изменений в самом файле нету. если запускаю кодогенерацию в docker'e, то вылезает проблема с clrf -> lf. если в докере пробовать подставить line.separator, чтоб генерить как-бы под виндой, то билд просто падает
Почему бы не сходить на гитхаб к ним?
источник

NG

Nikita Gryzlov in pro.jvm
Dmitry Zvorygin
ну и посмотреть различия в flame graph - и посмотреть где именно начинаются различия
в 2.3.5 CommonAnnotationBeanPostProcessor вообще не светится. в этом графе скорее всего опущены "маленькие" вызовы, не могу гарантировать, что этот БПП вообще не вызывался. в блэйме по файлу за прошедший год изменения есть, но не в этой тяжелой функции
https://github.com/spring-projects/spring-framework/blame/3113917c553197fc5e25282b02c6dcc504e46dca/spring-context/src/main/java/org/springframework/context/annotation/CommonAnnotationBeanPostProcessor.java#L335
источник

NG

Nikita Gryzlov in pro.jvm
Alexey Genus
Версия java случайно заодно не менялась? Flamegraph пустой какой-то, а это, мне кажется, значит, что тормоз находится в synchronized-блоке там
нет, последовательный запуск на одной и той же машине
источник

AG

Alexey Genus in pro.jvm
Я бы попробовал снять профиль на ожидание локов, возможно что-то даст
источник

NG

Nikita Gryzlov in pro.jvm
снятие фильтров с графа показало занятную картинку
https://i.postimg.cc/pT9NcQNM/image.png
источник

NG

Nikita Gryzlov in pro.jvm
а там, как вы и говорили, synchronized
    if (InjectionMetadata.needsRefresh(metadata, clazz)) {
     synchronized (this.injectionMetadataCache) {
       metadata = this.injectionMetadataCache.get(cacheKey);
источник

NG

Nikita Gryzlov in pro.jvm
судя по блэйму эти строки менялись от 4 до 12 лет назад :) то есть проблема не в самом блоке как таковом, а в коде, который стал вызывать этот BPP по-другому/чаще.
в общем, я понял, надо ковырять профайлер дальше, спасибо
источник

AG

Alexey Genus in pro.jvm
👍
источник

A

Artjom Kalita in pro.jvm
В 2.4 спринге есть актуатор эндпоинт который показывает стартап тайм статистику
источник

NG

Nikita Gryzlov in pro.jvm
Artjom Kalita
В 2.4 спринге есть актуатор эндпоинт который показывает стартап тайм статистику
это не стартап, это создание бинов уже в процессе работы.
источник

TH

Tomas Holshtein in pro.jvm
Сколько ж незнакомых слов😅
источник

A

Artjom Kalita in pro.jvm
Nikita Gryzlov
это не стартап, это создание бинов уже в процессе работы.
У вас какието бины создаются уже во время работы после стартапа приложения?
источник

NG

Nikita Gryzlov in pro.jvm
Artjom Kalita
У вас какието бины создаются уже во время работы после стартапа приложения?
да. куча прототайп бинов
источник

NG

Nikita Gryzlov in pro.jvm
по поводу разницы во flame graph:

2.3.5:
https://i.postimg.cc/J4BXCtVN/image.png

2.4.1:
https://i.postimg.cc/SsN9BrkR/image.png

на лицо постоянный cache miss в https://github.com/spring-projects/spring-framework/blob/3113917c553197fc5e25282b02c6dcc504e46dca/spring-context/src/main/java/org/springframework/context/annotation/CommonAnnotationBeanPostProcessor.java#L340

осталось разобраться, почему в 2.3.5 вообще ни одного построения метаданных, а в 2.4.1 - на каждый бин... ох, отлаживать кишочки спринга, мое любимое прям -_-
источник