1

さまざまな Java アプリを開発するためのリモート Linux ボックスを共有し、ここで説明されているように、ssh 経由で VisualVM を使用してアプリをプロファイリングします。プロセス/ユーザー間でポート番号を割り当て/プロビジョニングする必要なく、Java プロセスで JMX/プロファイリングを有効にする方法はありますか? プロファイリングを有効にするためだけに (一意の) ポート番号を指定していることを常に確認する必要があるのは面倒です。

これをより具体的にするために、ポートのハードコーディングは明らかに機能せず、競合します。

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し、競合がないことを期待するなど) を続行できますが、より良い方法があるかどうか、または間違っているかどうか疑問に思っています。

4

2 に答える 2

0

私の最善の推測では、VM を起動せずに VM を起動する方法があるかどうかを調べてから -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 に渡される環境変数は、JDK からコードを読み取ると単なる MAP のように見えます。マップに何を入れるかを見つけて、独自のコードでコネクタを開始し、その方法で独自のコードを作成できます。利用可能なポート番号を選択する 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           }
于 2012-02-17T09:16:52.690 に答える
0

考えられる解決策の 1 つは、リモート ボックスで VisualVM を実行し、vnc またはリモート X セッションを使用してローカル マシンに VisualVM を表示することです。

于 2012-02-20T13:36:25.200 に答える