log-pass-service
Описание
This application simulates memory leak and describes the analysis methods and different solutions to this problem
Языки
- Java100%
Memory Leak Demo Application
Общее описание приложения
Это демонстрационное приложение на Spring Boot, которое имитирует утечку памяти. Приложение сохраняет все пришедшие запросы на регистрацию пользователей в кэш, что приводит к постепенному увеличению потребления памяти. Для усиления утечки памяти, каждый объект содержит большой массив данных, который не сохраняется в базе данных, но занимает значительное количество памяти.
Приложение использует встроенную базу данных H2 для хранения данных пользователей.
Architecture
Основные классы и их взаимодействие
-
User:
- Класс, представляющий пользователя. Содержит поля
,id,loginиpassword. ПолеlargeDataне сохраняется в базе данных и используется для усиления утечки памяти.largeData
- Класс, представляющий пользователя. Содержит поля
-
UserRepository:
- Интерфейс, расширяющий
, для взаимодействия с базой данных H2.JpaRepository
- Интерфейс, расширяющий
-
UserService:
- Сервис, содержащий бизнес-логику для регистрации пользователей. Сохраняет все зарегистрированные объекты
в кэш (что вызывает утечку памяти), а также в БД.User
- Сервис, содержащий бизнес-логику для регистрации пользователей. Сохраняет все зарегистрированные объекты
-
UserController:
- Контроллер, обрабатывающий HTTP-запросы. Взаимодействует с
для регистрации пользователей.UserService
- Контроллер, обрабатывающий HTTP-запросы. Взаимодействует с
Взаимодействие классов
- UserController принимает HTTP-запросы на регистрацию пользователей и передает данные в UserService.
- UserService проверяет наличие логина в кэше и базе данных, создает новый объект
с большими данными и сохраняет его в кэш и базу данных.User - UserRepository используется для взаимодействия с базой данных H2.
Run
Запуск приложения осуществляется посредством плагина
Для запуска приложения с настройками памяти и автоматическим сбором дампа хипа при возникновении ,
приложение требуется запускать со следующими параметрами:
- -Xms32m -Xmx32m
- -XX:+HeapDumpOnOutOfMemoryError
Для запуска, находясь в директории проекта, выполните команду в консоли:
How to Use
Описание необходимых действий со стороны клиента
Для регистрации нового пользователя необходимо отправить POST-запрос
на endpoint с параметрами и .
Пример запроса:
Testing memory leak
Для проведения нагрузочного тестирования и инициирования утечки памяти в приложении необходимо:
выполнить более 5 http-запросов к приложению
Эти запросы инициируют создание большого количества данных в приложении, что в конечном итоге приводит к исчерпанию
памяти и возникновению .
Это можно сделать с помощью:
- Http-клиент - каждый запрос должен содержать уникальное значение параметра login
- JMeter - файл
- содержит тестовый план для JMeter, который запускает несколько HTTP-запросов к приложению.doc/test_log-pass-service.jmx
Heap dump analysis results
Выполнено с помощью Eclipse Memory Analyser.
Дамп хипа:
Default report
Объект класса указан как "Problem Suspect 1"
в отчете Memory Leaks и занимает значительное количество памяти.

Dominator tree
Объект класса и связанный с ним объект имеют самый большой объем retained heap в отчете Dominator Tree,
что указывает на то, что они удерживают много других объектов

Top consumers
Объект класса находится на первом месте в списке Biggest Objects
в отчете Top Consumers, что указывает на то, что он занимает значительное количество памяти

Fix memory leak reason
Исправления причины вызывающей утечку памяти разными способами реализованы в отдельных branches:
Использование WeakReference
Позволяет gc удалять объекты, которые больше не используются, даже если они находятся в кэше
branch: fix-memory-leak
Использование LinkedHashMap
Позволяет автоматически удалять самые старые элементы, когда размер кэша превышает заданное ограничение
branch: fix-memory-leak2
Использование библиотеки Caffeine
Позволяет легко управлять размером кэша и временем жизни объектов.
branch: fix-memory-leak3