Мониторинг использования памяти с Java SE 5Одним из преимуществ Java по сравнению с C++ стала концепция автоматического управления памятью. А именно - виртуальная машина Java имеет нить сбора мусора, которая освобождает неиспользуемую память, когда куча расходует все предоставленную память. Реализация стратегии сборки мусора зависит от производителя виртуальной машины, но общим является то, что этот процесс может быть довольно ресурсоемким. Виртуальная машина от Sun определяет 2 режима для сборки мусора: Легкий «copy» и Тяжелый «Mark-Sweep-Compact». «Легкая» сборка выполняется относительно быстро и затрагивает перемещение данных в куче во время выполнения других потоков. «Тяжелая» сборка является более основательной, приостанавливающей выполнение всех потоков на время своей работы. Основная цель оптимизации производительности кучи – уменьшить частоту и длительность «тяжелых» сборок. Виртуальная машина от IBM реализует другую архитектуру и различает режимы сборки мусора по состоянию кучи. Сборки мусора градируются от минимально влияющих чисток (выполняемых на mark фазе, выполняемой одновременно с другими нитями) до наихудшего сценария полного цикла mark-sweep-compact, т. н. сборки «stop-the-world».
Из-за того, что приложения Java и их соответствующие компоненты выполняются внутри виртуальной машины Java и хранят все экземпляры объектов в куче, задача настройки кучи имеет первостепенную важность.
До релиза платформы Java SE 5, в возможности мониторинга входили:
Каждая из этих стратегий имеет свои плюсы и минусы, касающиеся накладных расходов и трудностeй реализации, и, как результат, отсутствие единой оптимальной стратегии.
Одним из преимуществ мониторинга производительности серверов приложений является то, что все основные производители освоили Java Management Extensions (JMX) и выдают информацию мониторинга в форме Managed Beans (MBeans). С выходом Java SE 5, к самой виртуальной машине были добавлены реестр JMX и поддержка MBeans. С этого времени все прелести этого подхода доступны и настольным приложениям. В дополнение к этому, спецификация Java SE 5 определяет новые классы и интерфейсы в пакете java. lang. management, показывающие статистику виртуальной машины времени выполнения. Небольшое количество этих интерфейсов реализовано в виде managed beans, отражающих информацию о поведении памяти виртуальной машины, а также память процесса отведенную под кучу и остальную. В этой статье мы затронем 3 интерфейса:
Все управляющие MBeans можно загрузить с помощью класса-помощника - java. lang. management. ManagementFactory, предоставляющего набор статических методов, возвращающих запрашиваемые Mbeans.
MemoryMXBean предоставляет информацию об использовании памяти, отведенную под кучу и остальную. Конкретнее, он делает это с помощью следующих 2 методов:
Эти методы возвращают экземпляры java. lang. management. MemoryUsage, в котором определены 4 ключевых атрибута:
The MemoryPoolMXBean сообщает информацию о специализированных пулах памяти в JVM. Для тех, кто знаком с кучей в ВМ Sun, эти пули включают Eden Space, Survivor Space, Tenured Generation и Permanent Generation. Ключевым моментом этого является то, что память разделена на логические разделы. Каждый MemoryPoolMXBean позволяет получить следующую информацию:
GarbageCollectorMXBean предоставляет информацию о времени сборок и их количестве по каждому из пулов памяти. Листинг 1 использует каждый из вышеперечисленных MBeans в связке с намеренно плохим управлением памятью для вывода информации о пямяти виртуальной машины.
На листинге представлен класс, показывающий использование памяти в виртуальной машине перед и после создания миллиона строковых переменных. Его выполнение начинается с получения и вывода информации через MemoryMXBean. В данном случае минимальное и максимальное значение размера кучи было установлено в 32Мб с использование следующих параметров при загрузке: -Xms32m –Xmx32m
Использованная память уменьшилась с 236Кб до 213Кб после выполнения, что, как мы установим, явилось результатом нескольких сборок мусора.
Информация о сборках мусора получена от GarbageCollectorMXBean. Виртуальная машина Sun в стандартной конфигурации реализует 2 сборщика мусора: “Copy” и “MarkSweepCompact”. В этом участке вывода программы вы можете увидеть, что создание и разрушение миллиона строк вылилось в 63 сборки типа “copy”, что заняло 12 миллисекунд времени. Если мы изменим код так, чтобы не разрушать строки между итерациями, то мы увидим как происходят сборки “MarkSweepCompact”.
В конце мы выводим информацию о разных пулах памяти, используя MemoryPoolMXBeans. Он возвращает несколько пулов в виртуальной машине от Sun:
Из приведенного мы можем увидеть, что для 32Мб кучи под Windows с установками по умолчанию под Eden отведено 2112KB, каждая из двух survivor областей получила по 192Кб и TenuredGen получила оставшиеся 30272KB. Все в сумме составило 32768KB кучи. шнтересно, что PermGen получает в начале 8Мб и может вырасти до 64Мб. Собирая эту информацию, вы можете анализировать поведение кучи. Для тех из вас, кто склонен к таким занятиям, Mbeans предоставляют интерфейс оповещения, информацию о котором вы найдете в Java SE 5 Javadocs.
Если вы хотите получать всю эту информацию в режиме реального времени, JDK от Sun содержит Java Monitoring and Management Console (JConsole), которая может подключаться к уже запущенной виртуальной машине и получать и выводить эту информацию. Вы можете прочитать больше о ней в статье Mandy Chung на сайте Sun: Using JConsole to Monitor Applications.
ЗаключениеМониторинг использования памяти в Java 1. 4 и ниже был похож на черную магию. С появлением Java SE 5 и открытых интерфейсов, таких как JMX, задача существенно упростилась. С устранением технических трудностей при получении этой информации, вы можете сконцентрироваться на настоящих задачах, таких как анализ этих показателей. Вернутся Вам будет интересно:
|
- Публикации
Итак, у вас имеется свой собственный форум, но его никто не посещает? Мы готовы помочь вам справиться с этой нелегкой проблемой.
Данная статья в основном рассчитана на тех, кто самостоятельно занимается продвижением своего проекта.
Проклял все настройки кодировок, проклял DirectAdmin и еле-еле нашел то место где располагается и задается общий пароль для ...
Твиттер уже давно стал из нового web 2. 0 сервиса рекламной площадкой с огромным количеством потенциальных пользователей ...
Самое время кратко описать, чем нам придется заниматься. Прежде всего нужно понять, что блог ты будешь делать для получения ...
Долго не знал с чего начать данную статью. Статья что-то типа мыслей вслух и философии.