Java language простой пример jmh
Содержание:
- jmap (sun.tools.jmap)
- IDE support
- Новый агент Zabbix теперь официально поддерживается
- Blazix
- Getting Support
- Java Monitoring Utilities
- Create a heap dump for offline analysis
- Community
- What is a Java MBean?
- Я ничего не понял. JMX, RMI, JNDI? WTF?
- Java performance monitoring with Applications Manager Java monitor tool.
- Feature Comparison
- JMX monitoring: What is Java JMX?
- Building the «Bleeding Edge» JMH
jmap (sun.tools.jmap)
Иногда проблема заключается в утечке объекта, такого как (а он может содержать тысячи объектов), который просто не появляется, когда нужно. Другая, более общая проблема, ― разрастание кучи, которая, кажется, никогда не сокращается, несмотря на активный сбор мусора.
В поисках утечки объекта очень полезно сделать снимок текущего состояния, а затем просмотреть его. Первую часть этой задачи решает утилита , которая делает снимок текущего состояния кучи. Затем можно проанализировать данные с помощью утилиты , описанной в следующем разделе.
Как и все прочие описанные здесь утилиты, использовать довольно легко. Достаточно указать VMID Java-процесса, который нужно «заснять», и некоторые параметры для описания результирующего файла. Параметры, передаваемые , состоят из имени файла дампа и его типа ― текстовый или двоичный. Двоичный файл полезнее, но только в сочетании с каким-нибудь инструментом индексации — вручную продираться сквозь несколько мегабайт текста, заполненных шестнадцатеричными числами, ― не лучший способ провести день.
Для получения более общего представления о куче Java можно воспользоваться параметром утилиты . В этом случае она выдает текстовую гистограмму объектов, весомо представленных в куче на текущий момент, которые отсортированы по общему количеству байтов, занятых объектами конкретного типа. Она также указывает общее количество экземпляров этих объектов, что позволяет выполнить некоторые простые расчеты и сделать предположение об относительных расходах на экземпляр.
К сожалению, утилита не позволяет определять значения за период и максимальное значение, как , но ее легко вставить в цикл (или ) в сценарии оболочки или в другом классе, чтобы делать снимки периодически. (На самом деле, это было бы хорошим дополнением к в виде расширения самого исходного кода OpenJDK или другой утилиты.)
IDE support
While the command line approach is the suggested one, some
people prefer to use IDEs. The user experience varies between
different IDEs, but we will outline the general things here.
Running benchmarks from the IDE is generally not recommended due to
generally uncontrolled environment in which the benchmarks run.
-
Setting up the benchmarking project. Some IDEs provide
the GUI to create the Maven project from the given archetype. Make
sure your IDE knows about Central archetype catalog, and look for
org.openjdk.jmh:jmh-${lang}-benchmark-archetype there.
Alternatively, you can use the command line to generate the
benchmark project, see above.NOTE: JMH is not intended to be used in the same way as a
typical testing library such as JUnit. Simply adding the
jar file to your build is not enough to be
able to run benchmarks. -
Building the benchmarks.
Most IDEs are able to open/import Maven projects, and infer the
build configuration from Maven project configuration. IDEA and
Netbeans are able to build JMH benchmark projects with little to no
effort. Eclipse build configuration may need to set up JMH
annotation processors to run. -
Running the benchmarks. There is no direct support for
JMH benchmarks in the IDE, but one can use JMH Java API to invoke
the benchmark. It usually amounts to having the
method, which will then call into JMH. See
JMH Samples for the examples of this approach. Before you run
any benchmark, the project build is required. Most IDEs do this
automatically, but some do require explicit build action to be
added before the run: adding Maven target «»
should help there.
Новый агент Zabbix теперь официально поддерживается
Новый агент предлагает широкий спектр новых возможностей и расширенные функции мониторинга для Linux и Windows:
- Написан на языке Golang
- Плагин фреймворка для мониторинга различных сервисов и приложений
- Способность поддерживать состояние между проверками (например, поддержание постоянных соединений с БД).
- Поддержка ловушек
- Встроенный планировщик для поддержки гибких интервалов времени
- Эффективное использование сетевых ресурсов за счет передачи больших объемов данных
- Поддержка длительного хранения собранных данных
- Замена существующих агентов на Linux и Windows
С полным списком новых функций можно ознакомиться в документации.
Документация.
ВАЖНО! Существующий агент Zabbix по-прежнему будет поддерживаться.
Blazix
Blazix — это полнофункциональный сервер приложений Java и веб-сервер (обслуживающий HTML-файлы и изображения в дополнение к стандартной рабочей нагрузке сервера приложений). В настоящее время Blazix предоставляет Servlet 2.3, JSP 1.2, EJB 1.1 и JMS 1.0.2. Он также реализует HTTP / 1.1 и полностью написан на Java, и может использоваться кроссплатформенно. Он может использоваться в качестве полноценного веб-сервера сам по себе, особенно при большом объеме трафика.
Некоторые из включенных функций имеют поддержку кластеризации без единой точки отказа для балансировки нагрузки и восстановления после сбоя, развертывания и обновления EJB и веб-архива, веб-сервисы Secure Socket Layer, управление транзакциями, безопасность.
Оцени статью
Оценить
Средняя оценка / 5. Количество голосов:
Видим, что вы не нашли ответ на свой вопрос.
Помогите улучшить статью.
Спасибо за ваши отзыв!
Getting Support
Make sure you did this before publishing the benchmark, and/or
requesting the JMH feature:
-
JMH annotations Javadocs and Samples are essential
reading. Follow the
JMH samples to get familiar with the API, use cases, culprits,
and pitfalls in building the microbenchmarks and using JMH. -
Your benchmarks should be peer-reviewed. Do not assume
that a nice harness will magically free you from considering
benchmarking pitfalls. We only promise to make avoiding them
easier, not avoiding them completely.
Make sure you tried these things before getting support:
-
Archetypes provide the golden build configuration. Try
to generate the clean JMH benchmark project and transplant the
benchmark there. This is important to try when upgrading to the
newer JMH versions, since the minute differences in the build
configurations may attribute to the failures you are seeing. -
Current development code is usually leaner, meaner, and
better. Try to run with bleeding edge JMH to see if the issue
is already fixed. -
See if your question/issue was discussed already. Look
around mailing list archives to see if there is already an
answer.
If all these did not help, you are welcome at the JMH mailing
list.
Java Monitoring Utilities
Java is not just a programming language but a very rich ecosystem with a lot of tools. The JDK contains programs that allow us to compile our own programs, as well as monitor their state and the state of the Java Virtual Machine during the full life cycle of program execution.
The bin folder of a JDK distribution contains, among others, the following programs that can be used for profiling and monitoring:
- Java VisualVM (jvisualvm.exe)
- JConsole (jconsole.exe)
- Java Mission Control (jmc.exe)
- Diagnostic Command Tool (jcmd.exe)
We suggest exploring the content of this folder to be aware of what tools we have at our disposal. Please note that the Java VisualVM was part of the Oracle and Open JDK distributions in the past. However, starting from Java 9, JDK distributions no longer ship with Java VisualVM. Therefore, we should download it separately from the VisualVM open source project website.
In this tutorial, we’ll focus on the Java Flight Recorder. This isn’t present among the tools mentioned above because it isn’t a standalone program. Its usage is closely related to two of the tools above — Java Mission Control and Diagnostic Command Tools.
Create a heap dump for offline analysis
Things often move quickly in a production environment, and you may not have
quality time to spend with your application profiler. Instead, you can
take a snapshot of everything in your Java environment and save it to look
at later. You can do this in JConsole, and do it even better in
VisualVM.
Start by navigating to the MBeans tab, where you’ll open the
node, followed by the
node. Now select ,
and note the «dumpHeap» button that appears in the right-hand pane. If you
pass dumpHeap a filename to dump to in the first («String») input box, it
will take a snapshot of the entire JVM heap and dump it to that file.
Later, you can use a variety of different commercial profilers to analyze
the file, or use VisualVM to analyze the snapshot. (Remember that VisualVM
is available as a stand-alone download.)
Community
-
Mailing lists
jmx-dev
-
JMX bloggers
-
Éamonn
McManus: JMX Specification Lead: The web log of the JMX
Specification lead. -
Jean-François Denise:
JMX, NetBeans and More!: News and tips relating to the JMX
NetBeans module. -
Daniel Fuchs: JMX,
SNMP, Java, etc…: Various musings about the JMX API, network
technology, the Java platform and related subjects. -
Luis-Miguel
Alventosa: JMX, RMI, Monitoring & Security: Tech tips and
updates about the security and monitoring aspects of the JMX
technology. -
Joël Féraud:
Building JMX source code: How to modify, recompile and rebuild
the source code of the JMX API.
-
Éamonn
-
Other blogs of interest to the JMX Technology
- A.
Sundarajan - Alan Bateman
- Danny
Coward - Mandy
Chung
- A.
What is a Java MBean?
MBeans are just objects with methods that return information and are able to export this information via the MBeanServer to the outside world.
There are four types of MBeans:
Standard MBean:
This is the most common and easiest way to instrument an application. They retrieve the current value of the metrics, and allow you to modify them. Standard MBeans also implement some operations that can be invoked from outside the program during its execution.
Use this one if you don’t need any extra behaviour, the only thing you need to do is create an interface with getter functions that export the information you want.
Dynamic MBean:
This kind of MBean also implements getters and setters to retrieve or modify the metric that can be auto discovered by implementing the javax.management.DynamicMBean interface.
These are useful when we have a class that doesn’t follow the MBean standard to publish the metrics. We can manually define how the MBeanServer must publish the values inside this class.
Use this one if you don’t want to code an interface, or you don’t know beforehand what fields you need to export.
Model MBean:
This is a generic, dynamic and configurable in runtime type of MBean used to instrument the resources. It allows any manager connected to the Java Dynamic Management agent to create and configure the MBean dynamically.
Use this one if you need to give anyone who connects to the JMX freedom to instantiate and configure the MBean programmatically.
Open MBean:
These are a type of Dynamic MBean and thus they must implement the javax.management.DynamicMBean interface.
This type allows us to instrument objects that are discovered in runtime using only a predefined set of Java classes:
- java.lang.Boolean
- java.lang.Byte
- java.lang.Character
- java.lang.Short
- java.lang.Integer
- java.lang.Long
- java.lang.Float
- java.lang.Double
- java.lang.String
- java.math.BigInteger
- java.math.BigDecimal
- javax.management.ObjectName
- javax.management.openmbean.CompositeData
- javax.management.openmbean.TabularData
Use this one if you need flexible means of instrumenting resources that need to be open to a wide range of applications that use the JMX specification since they don’t need to load specific Java classes from the application.
Я ничего не понял. JMX, RMI, JNDI? WTF?
Хорошо-хорошо, давайте немного разберёмся, как всё это работает.JMX (Java Management Extensions) — технология Java, предназначенная для мониторинга и управления (в т.ч. удалённо) различными объектами (ресурсами): приложениями, устройствами, сетями — лишь бы этот объект был написан на Java.
Эти ресурсы называются MBeans (ManagedBeans). Каждый такой объект реализует определённый интерфейс, через который можно получить доступ к значениям атрибутов этого объекта, а также вызвать его методы и получать уведомления (если приложение зарегистрирует соответствующие “слушающие” MBean’ы).
MBeans регистрируются на MBean Server — реестре объектов. Любой зарегистрированный объект становится доступным для приложений (точнее, становится доступным его интерфейс).
Доступ к ресурсам осуществляется при помощи JMX-коннекторов, которые делают MBean Server доступным для JMX-клиентов. JMX-коннектор состоит из клиента и сервера. Коннектор-сервер соединяется с MBean-сервером и слушает запросы соединений от клиентов. Коннектор-клиент обычно находится на другой JVM, а чаще всего вообще на другой машине по отношению к коннектор-серверу.
JMX API имеет стандартный протокол подключения, основанный на Remote Method Invocation (RMI). Этот протокол позволяет JMX-клиенту удалённо получить доступ к MBean’ам на MBean-сервере. Кроме штатного RMI существуют и другие протоколы: JMXMP, JBoss Remoting, Hessian, Burlap, и даже HTTP и SNMP.
Используя интерфейс MBean’а клиент может получать различные метрики этого объекта, а также вызывать публичные методы.
Схематично взаимодействие компонентов можно изобразить так:
Любое приложение на платформе Java SE “из коробки” имеет возможности для его мониторинга: RMI коннектор автоматически делает доступным ваше Java приложение для удалённого управления и мониторинга. Достаточно лишь запустить приложение с нужными параметрами, и JMX-клиенты (а Zabbix Java Gateway — это JMX-клиент) уже смогут подключаться к нему удалённо и получать нужные метрики.
Чтобы указать JMX-клиенту конкретное приложение, к которому вы хотите подключиться, используется специальный адрес, который называется JMX endpoint (он же JMXServiceURL). Если говорить строже, то это адрес коннектор-сервера JMX API. Формат этого адреса определяется RFC 2609 и RFC 3111. В общем случае он выглядит так:
Где «service:jmx:» — константа.
protocol — это транспортный протокол (один из многих: RMI, JMXMP, etc), используемый для подключения к коннектор-серверу.sap — адрес, по которому коннектор-сервер может быть найден. Задаётся в таком формате (это подмножество синтаксиса, определённого в RFC 2609):
host — ipv4 адрес хоста (или ipv6, заключённый в квадратные скобки) и необязательный (в зависимости от протокола) номер порта.url-path — необязательный URL (обязательность зависит от протокола).
Лучше всего разобраться с этим на примере. Часто можно встретить такой JMX endpoint, вид которого некоторых может ввести в ступор:
Но на самом деле не всё так страшно.host — это целевой хост, где запущено наше приложение.port1 — это порт RMI-сервера, к которому мы хотим подключиться.
а port2 — это порт RMI registry (каталог, где регистрируются RMI-серверы). По умолчанию: 1099.
Если знать о том, что RMI-реестр выдаёт адрес и порт RMI-сервера по запросу клиента, то становится понятно, что первая часть здесь лишняя. Таким образом адрес можно сократить до такого вида:url-path часть означает буквально следующее: возьми ту часть URL, которая следует сразу за /jndi/ и выполни по этому адресу JNDI-запрос в RMI registry, чтобы получить информацию об RMI-сервере. Реестр вернёт в ответ его хост и порт.
Следует отметить, что порт в таком случае генерируется случайным образом и могут возникнуть проблемы с настройкой файрвола. В таких случаях и записи JMX endpoint’а, потому что он позволяет явно указать порт.
Если вам хотелось бы глубже разобраться в JMX, то рекомендуем обратиться к официальной документации Oracle.
Java performance monitoring with Applications Manager Java monitor tool.
Applications Manager Java performance monitor tracks a variety of metrics including JVM memory, garbage collection (GC), threads, etc. for thorough Java performance monitoring. The performance of Java applications mainly depends on two parameters:
- Memory consumption
- Response/connection time
Deep insight into memory stats
Memory consumption is a parameter that requires constant monitoring. Applications Manager’s Java memory monitoring capabilities allow you to monitor both physical (CPU, disk) and virtual (JVM) memory consumption. Exhausting your JVM memory will lead to latency or, even worse, system crashes.
Applications Manager’s Java performance monitoring tool provides details about JVM memory with extensive stats and division of heap and non-heap memory like Eden Space, survivor space, Tenured Gen, PermGen, and Code Cache. Apart from JVM monitoring, you can also perform garbage collection, and generate thread and heap dump remotely with Applications Manager’s JVM monitor.
Allocate generational memory efficiently
Java applications perform automatic memory management, a process referred to as garbage collection, which collects JVM objects that are no longer needed to make space for new objects. Monitoring garbage collectors is essential for optimal generation sizing and allocation of objects. Applications Manager’s JVM monitor provides you with a summary of the garbage collection process and specific collector stats.
Learn how Applications Manager can satisfy all your Java monitoring needs. Schedule a personalized demo today.
Avoid concurrency issues
Java exhibits asynchronous behavior through parallel processing. Issues arise when the threads that are working side by side need to access the shared data pool, resulting in deadlocks or incorrect program data. With Applications Manager’s Java performance monitoring tool, perform thorough Java thread monitoring and tracks crucial thread attributes like Total Threads Started, Peak Threads, Live Threads, Runnable, Blocked, Waiting, Timed Waiting, Daemon Threads, and Deadlocked Threads. You can also view the thread dump history of the Java machine, which gives you the status and essential details about all the threads.
Visualize Java transactions with the APM Insight agent
In addition to Java monitoring, Applications Manager also monitors J2EE web transactions. Applications Manager’s APM Insight agent translates how your Java applications behave on the end user’s side and provides visual representations of J2EE transactions from URL to SQL components. It also enables you to measure your client’s satisfaction with APDEX scores, and trace transaction errors back to their origins.
Troubleshoot quicker with Applications Manager’s fault management system
Applications Manager’s Java performance monitoring tool comes with an extensive fault management system to make resolving issues easy. With help from the root cause analyzer, you can drill down to the source of problems, and troubleshoot them with ease.
Applications Manager’s JVM monitoring capability lets you configure threshold values for attributes, and receive notifications when there are deviations from standard behavior. Setting up anomaly profiles can help you identify gradual performance degradation, so you can take action before end users are affected. Applications Manager’s Java monitoring tool also enables you to associate actions to the thresholds and anomaly profiles that will be automatically performed upon a breach.
Take advantage of data-rich reports
Applications Manager’s Java monitoring tool utilizes analytical details to perform historical and predictive analysis of Java performance with the help of reports. While trend analysis reports allow you to compare and analyze historical performance trends based on hourly/daily/weekly reports and heat charts, forecast reports employ machine learning techniques to predict growth and utilization trends in the future.
Unlike most Java performance monitoring tools, Applications Manager Java application monitoring tool also offers statistical reports to help you gain visibility into how various command line parameters and garbage collection algorithms impact the Java application performance.
Feature Comparison
3.1. Event Driven Processing
WatchService API is driven by the file system change events triggered by the operating system. This approach saves the application from polling the file system repeatedly for changes.
Apache Commons IO Monitor library on the other hand, polls the file system location at a configurable sleep interval by calling the listFiles() method of File class. This approach wastes CPU cycles, especially if no change occurs.
3.2. Callback Method
WatchService API does not provide callback methods. Instead it provides two types of polling methods to check if new change events are available for processing:
- Blocking methods like poll() (with a timeout parameter) and take()
- Non-blocking method like poll() (without a timeout parameter)
With the blocking methods, the application thread starts processing only when new change events are available. Therefore, it needs not keep on polling for new events.
The details and usage of these methods can be found in our article here.
In contrast, Apache Commons IO library provides callback methods on the FileAlterationListener interface which are invoked when a change in the file system location or directory is detected.
3.3. Event Overflow
WatchService API is driven by the operating system events. Hence, there is a possibility that the operating system buffer that holds the events overflows, if the application cannot process the events quickly enough. In this scenario, the event StandardWatchEventKinds.OVERFLOW is triggered indicating that some of the events are lost or discarded before the application could read them.
This requires proper handling of the OVERFLOW event in the application to ensure that the application can handle any sudden burst of change events that may trigger the OVERFLOW event.
The Commons IO library on the other hand, is not based on the operating system events and hence there is no question of overflow.
In every poll, the observer gets the list of files in the directory and compares it with the list obtained from the previous poll.
- If a new file name is found in the last poll, onFileCreate() is invoked on the listener
- If a file name found in the previous poll is missing in the file list obtained from the last poll, onFileDelete() is invoked on the listener
- If a match is found, the file is checked for any change in attributes like last modified date, length etc. If a change is detected, onFileChange() is invoked on the listener
JMX monitoring: What is Java JMX?
Large-scale Java applications bring with them various metrics needs. Whether you want to ensure all is working as it should, gather performance information, or understand usage patterns such as number of users connected, which endpoints are the most used ones in a REST API, etc.
For large applications that, for instance, read or write from a database many times per second, it’s good practice to provide a monitoring interface like Java Management Extensions instead of logging output messages. Custom Java metrics are easier to maintain, troubleshoot and integrate with external monitoring tools. Any class that exports data to JMX is called a Managed Bean (MBean). These MBeans publish (export) their metrics to a MBean Server provided by the Java platform.
The MBeanServer can be assimilated to a metric collection agent that scrapes the configured endpoints (MBeans) and publishes the metrics using different protocols like Java RMI or HTTP/SOAP.
This would be a basic representation of the JMX monitoring/MBean architecture:
Building the «Bleeding Edge» JMH
In some cases, you want bleeding edge code which contains fixes,
features, and APIs not available yet in released versions. This
section explains how to get the «bleeding edge» JMH in your
project.
-
Check out JMH source with Mercurial:
-
Build JMH. You can optionally skip the tests:
You only need to do this step once, and Maven will deploy JMH
into Maven repo on your local machine. -
If you already have the benchmark project, then it is enough to
change JMH dependencies version to the latest
version (look up the actual latest version in ). If not, create the JMH benchmark project and change the
version there. -
Done! Build the benchmark project, and run it: