Утечка памяти Java при создании множества пустых карт

Возможно, что при получении сообщений от Kafka, когда я создаю пустую карту с помощью Map.of(), я могу вызвать утечку памяти или более интенсивное использование процессора?

Прослушивателей может быть несколько, но есть два типа: один получает заголовки:

    @KafkaListener(...)
    public void processMessage(String message,
                               ConsumerRecordMetadata metadata,
                               @Header(name = ID, required = false) String id,
                               @Header(name = TIME, required = false) String time) {
        var headers = Map.of(ID, id, TIME, time);
        ...
}

и еще один, где нет заголовков:

    @KafkaListener(...)
    public void processMessage(String message,
                               ConsumerRecordMetadata metadata) {
        var headers = Map.of();
        ...
}

А затем на более абстрактном уровне я проверяю, есть ли заголовки или нет, но я думаю, что это не так - как указано в заголовке, существует ли вероятность того, что если трафик сообщений увеличится, процессор может быть ограничен?

И да, это происходит :|

Нет, Map.of — это не утечка памяти. Это будет довольно серьезная проблема, хотя пустая карта настолько мала, что вы потеряете пару миллионов, прежде чем увидите результат. Как вы думаете, почему это утечка памяти? Какое это имеет отношение к дросселированию процессора? Чего нет в названии.

matt 16.05.2024 09:39

Map.of является синглтоном и не размещает в куче более одного экземпляра.

Valerij Dobler 16.05.2024 09:56

Если вы считаете, что в Java есть утечка памяти, гораздо более вероятно, что вы непреднамеренно удерживаете ссылки. Если все, что вы делаете, это создаете эту карту, проверяете ее, а затем отбрасываете, вы не будете удерживать ссылку.

Andy Turner 16.05.2024 10:43

Существуют инструменты (профилировщики памяти), которые можно использовать для поиска утечек памяти. Если вы подозреваете, что у вас есть утечка, воспользуйтесь одним из этих инструментов, чтобы выявить проблему, а не делайте поспешных выводов.

Stephen C 16.05.2024 11:37
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
4
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Нет никаких оснований полагать, что пустая карта может привести к утечке памяти больше, чем та, которая содержит данные.

Утечка памяти также не приводит к регулированию процессора напрямую (использование всей кучи, поэтому утечки могут в конечном итоге привести к этому).

Прежде чем делать поспешные выводы, вам следует оценить проблему.

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

Другие вопросы по теме