Избегайте необходимости устанавливать порты jmxremote (для удаленного использования VisualVM)? - PullRequest
1 голос
/ 17 февраля 2012

У нас есть удаленный Linux-модуль для разработки различных приложений Java, и мы используем VisualVM поверх ssh для профилирования приложений , как описано здесь . Есть ли способ включить JMX / профилирование в наших процессах Java без необходимости выделять / предоставлять номера портов среди наших процессов / пользователей? Раздражает необходимость всегда указывать (уникальный) номер порта только для включения профилирования.

Чтобы сделать все это более конкретным: жесткое кодирование порта, очевидно, не работает и будет конфликтовать:

exec java -Dcom.sun.management.jmxremote.port=3000 ...

Мы можем требовать всегда указывать уникальный порт при каждом запуске процесса, но это утомительно - вы должны убедиться, что ваши порты не конфликтуют с другими вашими процессами, а также не конфликтуют с другими пользователями:

exec java -Dcom.sun.management.jmxremote.port=$1 ...

В настоящее время мы используем:

exec java -Dcom.sun.management.jmxremote.port=$(( $RANDOM + 2000 )) ...

Но мы все еще время от времени сталкиваемся с занятыми номерами портов.

Мы можем продолжить с более причудливыми сценариями (например, запросить netstat для занятых номеров портов и надеяться, что гонки нет), но нам интересно, есть ли лучший способ / делаем ли мы это неправильно.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2012

Одним из возможных решений является запуск VisualVM на удаленном компьютере и использование vnc или удаленного сеанса X для отображения VisualVM на локальном компьютере.

0 голосов
/ 17 февраля 2012

Мое лучшее предположение, что вы должны выяснить, есть ли способ запустить ВМ без -Dcom.sun.management.jmxremote.port=3000 ... но затем запустите собственные коннекторы MBeanServer

http://www.docjar.com/html/api/sun/management/jmxremote/ConnectorBootstrap.java.html

- это место, где sun jvm, кажется, запускает соединители на основе переданных системных свойств, я думаю, что чтение кода там предоставит достаточно информации, чтобы можно было запустить собственный MBeanServerConnector

http://docs.oracle.com/javase/1.5.0/docs/api/javax/management/remote/JMXConnectorServerFactory.html

переменные среды, передаваемые в newJMXConnectorServer, кажутся просто MAP, если вы читаете код из JDK, вы можете обнаружить, что поместить в карту, чтобы он запускал соединитель с вашим собственным кодом, и тогда вы можете написать свой собственный код Java, чтобы выбрать доступные номера портов. Я не пробовал этот подход, но он кажется многообещающим, и я действительно хочу ответить на вопрос, который вы подняли.

JMXConnectorServer connServer = null;
  735           try {
  736               connServer =
  737                       JMXConnectorServerFactory.newJMXConnectorServer(url, env, mbs);
  738               connServer.start();
  739           } catch (IOException e) {
  740               if (connServer == null) {
  741                   throw new AgentConfigurationError(CONNECTOR_SERVER_IO_ERROR,
  742                           e, url.toString());
  743               } else {
  744                   throw new AgentConfigurationError(CONNECTOR_SERVER_IO_ERROR,
  745                           e, connServer.getAddress().toString());
  746               }
  747           }
...