Виртуальная машина Java (JVM)
Сервер PAS, предназначенный для размещения веб-приложений OpenEdge, функционирует в среде виртуальной машины Java (JVM). JVM обеспечивает комплексное управление ресурсами, включая управление памятью, потоковыми операциями и вводом-выводом. Эта программная инфраструктура играет ключевую роль в определении конфигурации сервера, существенно влияя на его производительность. Например, с помощью JVM регулируются параметры развертывания веб-приложений, количество поддерживаемых клиентских соединений и скорость обработки клиентских запросов.
Мониторинг виртуальной машины Java (JVM)
Существуют специализированные инструменты, позволяющие осуществлять подключение к виртуальной машине Java (JVM) и анализировать её ключевые параметры. Одним из наиболее доступных и простых в использовании инструментов является JConsole, который входит в стандартный пакет дистрибутива Java.
JVM обладает встроенными механизмами журналирования, предоставляющими базовые возможности для отладки и анализа работы системы. Эти механизмы позволяют отслеживать использование памяти, что может быть полезно для выявления проблем с управлением ресурсами и оптимизации конфигурации JVM. Анализ журналов может служить основой для принятия обоснованных решений по настройке параметров виртуальной машины.
Java Distribution Tools
JConsole | Предлагает графический интерфейс, совместимый с JMX, для мониторинга виртуальной машины Java. |
jvisualvm | Обеспечивает мониторинг и профилирование ресурсов системы, включая оперативную память и центральный процессор. Предоставляет возможность анализа дампов памяти, выявления утечек памяти, доступа к MBeans и управления процессами сборки мусора. |
jps | Предоставляет перечень инструментированных виртуальных машин HotSpot JVM, функционирующих в целевой операционной системе. |
jstat | Осуществляет сбор и регистрацию статистических данных о производительности в соответствии с параметрами, указанными в командной строке. |
В случае, если имеющихся инструментов недостаточно, существует возможность использовать специализированные программные средства, доступные в сети Интернет. Кроме того, в виртуальной машине Java (JVM) предусмотрены параметры конфигурации системы управления памятью (сборщика мусора), которые могут быть настроены для обеспечения вывода текстовой информации в стандартный поток вывода с целью длительного мониторинга.
Опция JVM | Описание |
-verbosegc | Активизировать детализированную выдачу данных, касающихся процесса управления сборкой мусора. |
-XX:+PrintGCDetails | Напечатать детальные сведения о процессе сбора мусора. |
-XX:+PrintHeapAtGC | Предоставить данные о состоянии кучи до и после выполнения операции сборки мусора. |
-XX:+PrintGCTimeStamps | Добавление временных меток к данным сбора мусора |
-XX:+PrintGCDateStamps | Добавление дат-отметок к данным сбора мусора |
-Xloggc:<file> | Формирование отчета о сборе мусора в файл. |
Примечание: Настройка механизма сборки мусора представляет собой специализированную техническую задачу, выходящую за рамки данного документа. Для получения подробной информации по данной теме рекомендуется обратиться к специализированной литературе, профильным статьям в сети Интернет, а также официальной документации Oracle, содержащей исчерпывающие сведения по вопросам настройки механизма сборки мусора.
Управление памятью в JVM
Виртуальная машина Java (JVM) предоставляет две основные области памяти, которые могут быть конфигурированы в соответствии с требованиями конкретного приложения ABL, функционирующего в среде конечного пользователя: область стека и область кучи.
Область стека (Stack)
Область стека предназначена для хранения локальных переменных и параметров вызова методов. Каждый поток JVM выделяет отдельное пространство в этой области. Размер области стека можно оценить путем умножения максимального количества потоков JVM на заданный параметр конфигурации размера стека. Настройка области стека обычно не требуется, однако она может быть полезна для оптимизации памяти при запуске небольших веб-приложений или для поддержки крупномасштабных и сложных веб-приложений.
Область кучи (Heap)
Область кучи подразделяется на поколения (generations), которые определяют срок службы выделенных объектов до их удаления сборщиком мусора (garbage-collector). После освобождения памяти она становится доступной для повторного использования. JVM не возвращает память операционной системе даже в случае, если Java-приложение переходит в состояние ожидания. Мониторинг выделения памяти процессом операционной системы позволяет оценить максимальную нагрузку на память JVM, хотя это не обязательно указывает на постоянное использование памяти приложением.
Понимание концепции поколений в JVM критически важно для настройки объема памяти, доступного для выполнения операций и загрузки кода приложения. JVM предоставляет две отдельные конфигурации для управления объемом памяти:
Поколение | Категория конфигурации | Описание |
Young | heap (-Xms & -Xmx) | Недавно выделенный пул памяти, предназначенный для временного использования в процессе выполнения операций, продолжительность которых может быть ограничена. |
Old | heap (-Xms & -Xmx) | Освобождение памяти для молодого поколения, чей срок службы истек по истечении определенного временного интервала, при условии возможности продолжения функционирования в течение более продолжительного периода. |
Permanent | permgen
(-XX:PermSize & -XX:MaxPermSize) |
Постоянно загружаемый Java-класс и статические элементы, которые практически никогда не подвергаются процессу сборки мусора. |
Сборщик мусора (Garbage Collector)
Сборщик мусора является сложным механизмом, предназначенным для освобождения памяти, выделенной в куче, и повторного ее использования. JVM предоставляет различные реализации сборщиков мусора, которые могут быть настроены в зависимости от типа нагрузки, создаваемой приложениями Java, такими как Tomcat и развернутые на нем веб-приложения. Выбор оптимальной реализации и конфигурации сборщика мусора зависит от типа развернутых веб-приложений и объема клиентского трафика.
Общее правило заключается в минимизации выделения пространства для областей stack и permgen, предоставляя оставшуюся квоту процесса для области heap. Оптимальный выбор сборщика мусора требует нахождения баланса между редкими, но крупными сборками мусора, которые могут приостанавливать работу сервера, и частыми сборками, которые могут снижать производительность запущенных веб-приложений. Следует учитывать, что баланс может варьироваться в зависимости от комбинации веб-приложений, частоты клиентских запросов и объема обрабатываемых данных.
Таким образом, управление памятью в JVM требует комплексного подхода, включающего понимание структуры памяти, особенностей работы сборщика мусора и требований конкретного приложения.
Загрузчики классов в JVM
Виртуальная машина Java (JVM) использует подсистему, известную как class-loader, для загрузки байт-кода классов Java в область памяти permgen и последующей инициализации этого кода. Эта подсистема играет ключевую роль в обеспечении безопасности и управлении памятью в Java-приложениях. В частности, она влияет на систему безопасности Java, которая здесь не рассматривается, и на распределение пространства памяти permgen.
Class-loader представляет собой иерархическую структуру, состоящую из отдельных экземпляров загрузчиков классов. Когда требуется загрузить класс, но он еще не был загружен, JVM последовательно проверяет свою иерархию загрузчиков, начиная с корневого узла и заканчивая текущим. Благодаря этой структуре, классы могут быть совместно использованы несколькими загрузчиками классов, если они загружены на более высоком уровне иерархии.
Такое совместное использование классов позволяет оптимизировать использование пространства permgen, поскольку один и тот же класс не загружается многократно разными загрузчиками. Это особенно важно для высоконагруженных систем, где эффективное управление памятью является критическим фактором.
PAS for OpenEdge, основанный на Apache Tomcat, реализует многоуровневую иерархию загрузчиков классов с целью обеспечения эффективного управления ресурсами и безопасности. Основные уровни этой иерархии включают:
- JVM: Базовый уровень загрузчика классов, который обеспечивает загрузку классов, необходимых для работы самой JVM.
- Apache Tomcat System: Загрузчик классов, используемый для загрузки специфических библиотек, расположенных в каталоге bin.
- Apache Tomcat Common: Этот загрузчик обычно не используется, но в контексте PAS for OpenEdge он применяется для совместного использования общих библиотек (common/lib) между несколькими веб-приложениями. Это позволяет уменьшить объем потребляемой памяти за счет исключения дублирования библиотек.
- Загрузчик классов веб-приложения: Каждый экземпляр веб-приложения имеет собственный загрузчик классов, который отвечает за загрузку классов и библиотек, расположенных в каталогах WEB-INF/classes и WEB-INF/lib данного приложения.
Понимание работы загрузчиков классов веб-приложений имеет важное значение для оптимизации использования памяти. Например, если одно и то же веб-приложение развертывается несколько раз под разными именами или несколько разных веб-приложений содержат идентичные наборы библиотек и классов, это может привести к значительному увеличению объема потребляемой памяти.
Рассмотрим пример: если пять веб-приложений, каждое из которых содержит один и тот же набор библиотек и классов, развертываются одновременно, объем памяти permgen будет равен (размер библиотеки + размер класса) × 5. Однако, если все эти веб-приложения используют общий загрузчик классов для загрузки общих библиотек и классов, объем памяти permgen составит (размер библиотеки + размер класса) × 1.
Несмотря на преимущества использования общего загрузчика классов, такие как оптимизация памяти, существует и ряд ограничений. В частности, все веб-приложения должны использовать совместимые библиотеки и версии классов. Это может стать проблемой в ситуациях, когда требуется гибкость в использовании различных версий библиотек Java.
PAS for OpenEdge использует общий загрузчик классов для более чем 90% всех классов Java. Это позволяет эффективно управлять памятью и обеспечивать совместимость между различными веб-приложениями. Общий загрузчик классов обеспечивает оптимальное использование ресурсов, минимизируя дублирование библиотек и классов, что особенно важно в условиях высокой нагрузки и ограниченного объема памяти.