- Могут ли быть в Java утечки памяти и когда? Как обнаружить причину? Как снять heap-dump?
- Что такое Xmx и Xms, Xss?
- Какие инструменты для нагрузочного тестирования вы знаете?
- Чем докер отличается от виртуалки? Что лежит в его основе? Как работает Docker?
- Чем контейнер сервлетов отличается от сервера приложений? Какие знаете?
Могут. Профилировать. Снимать heap-dump, например с помощью jmap, загружать в memory profiler (например в VisualVM)
Подробнее:
- Доступно изложено на Baeldung или то же самое тут, но на языке родных осин.
- Ещё тут
- здесь
- Старенькая статья на Хабре про типичные случаи утечки памяти в Java
- Диагностика утечек памяти в Java на Хабре
- Ищем утечки памяти с помощью Eclipse MAT на Хабре
- Устранение утечек памяти посредством слабых ссылок
- Устранение утечек памяти посредством гибких ссылок
- Бывают ли в Java утечки памяти?
- Диагностика OutOfMemoryError подручными средствами
- Java VisualVM - Browsing a Heap Dump
- VisualVM: мониторинг, профилировка и диагностика Java-приложений
- Доклад Андрея Паньгина Всё, что вы хотели знать о стек-трейсах и хип-дампах
- Different Ways to Capture Java Heap Dumps
- Analyze memory snapshots с помощью IntelliJ IDEA
- Analyze objects in the JVM heap с помощью IntelliJ IDEA
JVM стартует с Xms
количеством выделенной под heap памяти и максимально может увеличить её до значения Xmx
.
Xss
флаг определяет размер выделенной под стек памяти.
Общий вид:
java -Xmx<количество><единица измерения>
Можно использовать различные единицы измерения, например килобайты (k
), мегабайты (m
) или гигабайты (g
).
Пример:
java -jar my.jar -Xms256m -Xmx2048m
Подробнее:
- В статье на Mkyong
- В статье Tuning JVM от Orcale
- В статье Factors Affecting Garbage Collection Performance от Oracle
- Список всех X опций CLI
Благодаря нагрузочному тестированию появляется возможность оценить производительность приложения при различных нагрузках от действий определённого количества пользователей приложения.
Существует несколько решений для проведения подобного рода тестирования:
- Apache JMeter - самый известный, opensource, поддерживает работу с различными сетевыми протоколами разных уровней HTTP, HTTPS, FTP, LDAP, SOAP, TCP, почтовых протоколов и shell-скриптов. Он, как java-based инструмент, предоставляет возможности по работе с JDBC, Message-oriented middleware (MOM) через JMS и Java Objects.
- LoadRunner - это сложный и универсальный инструмент для нагрузочного тестирования различных платформ. Платный, ориентирован в первую очередь на Enterprise.
- LoadNinja - платный, позволяет пользователям создавать нагрузочные тесты без использования каких-либо скриптов. Средствами браузера собирает метрики, которые позволяют оценить производительность приложения.
- WebLOAD - коммерческий комплексный инструмент. Предоставляет пользователям расширенные функции, такие как анализ производительности и интеллектуальная аналитика, а также интеграцию с рядом инструментов, начиная от мониторинга производительности до конвейеров CI/CD.
- LoadUI Pro - коммерческий инструмент от создателей SOAP UI, тесты которого можно использовать как сценарии нагрузочного тестирования. Предназначен для веб-сервисов и позволяет пользователям оценивать масштабируемость, скорость и производительность API.
- K6 - opensource инструмент, ориентированный на разработчиков и тестирования производительности сайтов. Скрипты пишутся на JavaScript. Запуск тестов происходит в консольном режиме, результаты тестирования по умолчанию также выводятся в консоль, однако доступна поддержка таких плагинов для вывода результатов, как Kafka, Datadog, InfluxDB, JSON и StatsD. Доступна интеграция с CI-инструментами.
- Яндекс.Танк - инструмент от Яндекс с модульной архитектурой, которая позволяет использовать различные генераторы нагрузок - высокопроизводительный асинхронный hit-based-генератор HTTP-запросов Phantom и сценарный инструмент jMeter. Встроенный мониторинг ресурсов, автоматическая остановка теста по заданным условиям, вывод результатов в консоль и в виде графиков, подключение пользовательских модулей.
- Gatling - opensource инструмент на Scala с использованием Netty и Akka. Скрипты пишутся на Scala, есть возможность интеграции с Jenkins.
Подробнее:
- Обзор инструментария для нагрузочного и перформанс-тестирования на Хабре
- Нагрузочное тестирование: с чего начать и куда смотреть на Хабре
- Нагрузочное тестирование на Gatling на Хабре
- Top 10 лучших инструментов для нагрузочного тестирования
- 9 этапов тестирования производительности
- 10 шагов для запуска тестирования производительности с Apache JMeter
- jMeter — Краткое руководство
- Rest API Load testing with Apache JMeter
- Load Testing with Gatling - The Complete Guide
- Открытые бенчмарки для нагрузочного тестирования серверов и веб-приложений
Виртуальная машина (Virtual Machine - VM) - программная и/или аппаратная система, эмулирующая аппаратное обеспечение и исполняющее приложения некоторой целевой платформы на платформе хоста. Иными словами - это виртуальный компьютер с виртуальными устройствами и независимой операционной системой, управлением памятью и другими компонентами. Т.о. на одном реальном компьютере может существовать несколько виртуальных, изолированных друг от друга, со своими ОС. Запускаемые внутри виртуальной машины приложения не имеют понятия о её виртуальности и взаимодействуют с ней как с реальной. Хотя VM изолирована от реального хоста, она может иметь доступ к его диску и периферийным устройствам. Существует возможность сделать backup'ы VM в виде текущего состояния системы и содержимого дисков для возможности последующего восстановления системы в исходное состояние.
Каждая VM несёт дополнительные расходы на эмуляцию оборудования и работу своей ОС.
Управляет виртуальными машинами на реальном железе гипервизор - это программное и/или аппаратное решение, процесс, который отделяет операционную систему компьютера и приложения от базового физического оборудования.
Самими популярными решениями виртуализации являются KVM с QEMU, XEN, решения от VMWare и Hyper-V.
Docker - программное решение, использующее виртуализацию на уровне операционной системы для доставки, развёртывания, изоляции и упаковки приложения со всеми его зависимостями в т.н. контейнер.
Контейнеры расходуют меньше места на диске и ресурсов хоста, потому что переиспользуют большее количество общих ресурсов хоста и обеспечивает виртуализацию на уровне ОС. Каждый из контейнеров работает как отдельный процесс основной ОС, у которого есть своё собственное виртуальное адресное пространство. Изоляция контейнеров достигается с помощью linux namespaces. Ограничить потребление системных ресурсов контейнером можно через cgroups.
Контейнер создаётся из образа, который в свою очередь основан на Dockerfile
проекта, и представляет собой набор файловых систем (слоёв) наслоённых друг на друга и сгруппированных вместе, доступных только для чтения. Контейнеры всегда создаются из образов, добавляя свой собственный доступный для записи верхний слой, в который вносятся необходимые для контейнера в процессе работы изменения. Это позволяет нескольким контейнерам переиспользовать один образ.
Docker-контейнеры используются различными системами оркестрации и CI/CD.
У Docker есть большой репозиторий образов - Docker-Hub
Кроме Docker, существуют и другие контейнеры.
На Хабре есть множество статей на тему Docker:
- VM или Docker?
- Серия статей "Изучаем Docker": част 1, часть 2, часть 3, часть 4, часть 5, часть 6
- Docker. Начало
- Как устроен процесс создания docker-контейнера (от docker run до runc)
- Полное практическое руководство по Docker: с нуля до кластера на AWS
- Лабораторная работа: введение в Docker с нуля. Ваш первый микросервис
- Исповедь docker хейтера
- Глубокое погружение в Linux namespaces
- Как я запускал Докер внутри Докера и что из этого получилось
- Понимая Docker
- Поняв Docker
- Основы Docker за Х часов и Y дней
- Docker и все, все, все
- Безопасность для Docker-контейнеров
- Методики уменьшения размеров образов Docker
- 10 практических рекомендаций по безопасности образов Docker: часть 1, часть 2
- Docker: вредные советы
- Docker: невредные советы
- Зачем нужен containerd и почему его отделили от Docker
- Зрелая исполняемая среда для контейнеров: containerd стал "выпускником" CNCF
А также на тему виртуализации:
- Гипервизоры. Что же это и как работает виртуальный сервер?
- Автоматизация Для Самых Маленьких. Часть 1.1. Основы виртуализации
- Архитектура Hyper-V: Глубокое погружение
- Hyper-V для разработчиков под Windows 10
- Общие принципы работы QEMU-KVM
- Работа с виртуальными машинами KVM. Введение
- Показатели эффективности: KVM vs. Xen
- Hyper-V или KVM?
Кроме того, можно углубиться в других источниках:
- Containers vs. virtual machines
- Play with Docker
- Документация Docker
- The Docker EcoSystem
- Hardware-assisted virtualization
- Full virtualization
- Сравнение гипервизоров: KVM, Hyper-V или VMware?
- Вся правда о гипервизорах
- Перестаем бояться виртуализации при помощи KVM
- Основы виртуализации и введение в KVM
- Виртуализация в Unix. Часть 1: Kernel-based Virtual Machine (KVM)
- Настольная книга по Linux/Cgroups
- Механизмы контейнеризации: cgroups
- Введение в контейнеры, VM и Docker для новичков
- containerd
- awesome-compose
- Learn Docker & Containers using Interactive Browser-Based Scenarios
- What Is Docker & Docker Container? A Deep Dive Into Docker!
- Docker for beginners
Контейнер сервлетов - это компонент веб-сервера для взаимодействия с Java-сервлетами - обеспечивает их жизненный цикл, сопоставление URL-адреса к определённому сервлету и имеет ли отправитель запроса по данному URL необходимые права доступа и т.п.
Примеры (также являются самостоятельными веб-серверами, но НЕ серверами приложений (реализуют неполный стек Java EE)):
- Самый известный - Apache Tomcat. Есть несколько вариаций: от простого контейнера до полноценного сервера приложений (TomEE)
- Jetty
- Undertow
Сервер приложений - сервер, который включает в себя контейнер сервлетов и реализует весь стек Java EE (ныне Jakarta EE).
Примеры:
Исчерпывающий ответ на вопрос "Зачем нужны сервера приложений, если есть Tomcat" можно найти в одноимённой статье.