Пол — это Java
153 subscribers
13 photos
2 videos
2 files
26 links
Канал, в котором живет вымышленный на основе реальных событий разработчик Пол, и вместе с ним мы пробуем узнать, что такое Java и не только👨🏻‍💻

@polyackov_ot
Download Telegram
Привет Пол (и привет всем)
Хочу поделиться недавним комментом из Merge Request, который будет интересен и тебе.

Кратко опишу задачу:
Мне нужно было слушать топик в Kafka, где могут быть сообщения, которые моей системе не нужно обрабатывать.

Для этой задачи я реализовал фильтр, давай посмотрим мой код ниже:
@Bean
public ConcurrentKafkaListenerContainerFactory<String, String> filterNonCurrentSourceSystemResponse(ConsumerFactory<String, String> consumerFactory) {
var factory = new ConcurrentKafkaListenerContainerFactory<String, String>();
factory.setConsumerFactory(consumerFactory);
factory.setRecordFilterStrategy(record -> {
var sourceSystemHeader = record.headers().lastHeader(KafkaConstants.SOURCE_SYSTEM_HEADER);
var sourceSystemHeaderValue = new String(sourceSystemHeader.value());
return !SourceSystemName.isCurrentSourceSystem(sourceSystemHeaderValue);
});
return factory;
}


На самом деле весь код читать и понимать не нужно, нам интересен фидбек к конкретной строке:
new String(sourceSystemHeader.value());


Для начала давай разберемся, что же здесь происходит:
🔸 sourceSystemHeader.value() возвращает byte[]
🔸 при конвертации в String каждый раз будет создаваться новый объект в heap
🔸 т.к. количество вариантов SOURCE_SYSTEM_HEADER сильно ограничено, возможно, для оптимизации работы с памятью стоит добавить интернирование в String Pool

Я так и поступил.

Пол и все-все-все, что думаете, стоит ли так помогать GC?
Также мы будем рады увидеть в комментах другие способы оптимизации работы с памятью.

PS: Хотел бы поделиться ссылкой, в ней довольно подробно и с примерами уже описаны оптимизации и String Pool. Думаю, вы сможете за 10-15 минут получить неплохой базис, и, при необходимости, погрузиться в эту тему глубже.

#String
🔥622👍2🤔1🗿1