1. 概要

このチュートリアルでは、JMXが起動時に3つのポートを開く理由を説明します。 さらに、JavaでJMXを起動する方法を示します。 その後、開くポートの数を制限する方法を示します。

2. JMXの定義

まず、JMXフレームワークとは何かを定義しましょう。 Java Management Extensions(JMX)フレームワークは、Javaアプリケーションを管理するための構成可能で、スケーラブルで、信頼性の高いインフラストラクチャを提供します。 さらに、アプリケーションをリアルタイムで管理するためのMBeanの概念を定義します。 フレームワークを使用すると、アプリケーションをローカルまたはリモートで管理できます。

3. JavaでJMXを有効にする

次に、JMXを有効にする方法を見てみましょう。 Javaバージョン1.5以前の場合、システムプロパティがあります com.sun.management.jmxremote。 そのプロパティで開始されたアプリケーションは、 JConsole ローカルおよびリモートから。 一方、プロパティなしで起動した場合、JConsoleからアプリケーションを表示することはできません。

ただし、Java 6以降では、パラメータは不要です。 アプリケーションは、起動後に自動的に管理できるようになります。 さらに、デフォルト構成ではポートが自動的に割り当てられ、ローカルでのみ公開されます。

4. JMXポート

この例では、Java6以降を使用します。 まず、無限ループのクラスを作成しましょう。 クラスは何もしていませんが、開いているポートを確認できます。

public class JMXConfiguration {

    public static void main(String[] args) {
        while (true) {
            // to ensure application does not terminate
        }
    }
}

次に、クラスをコンパイルして開始します。

java com.baeldung.jmx.JMXConfiguration

その後、プロセスに割り当てられているpidを確認し、プロセスによって開かれたポートを確認できます。

netstat -ao | grep <pid>

その結果、アプリケーションによって公開されているポートのリストが表示されます。

Active Connections
Proto  Local Address          Foreign Address        State           PID
TCP    127.0.0.1:55846        wujek:55845            ESTABLISHED     2604

また、再起動の場合、ポートが変更されます。 ランダムに割り当てられます。 この機能は、JavaAttachAPIのアプリケーションを自動的に公開するJava6以降で使用可能になっています。 つまり、ローカルプロセスを介したJConsole接続用のアプリケーションを自動的に公開します。

次に、JVMにオプションを提供して、リモート接続を有効にします。

-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.port=1234
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

ポート番号は、リモート接続用にJMXを公開するために提供する必要のある必須パラメーターです。 テスト目的でのみ認証とSSLを無効にしました。

ここで、netstatコマンドは次を返します。

Proto  Local Address    Foreign Address State       PID
TCP    0.0.0.0:1234     wujek:0         LISTENING   11088
TCP    0.0.0.0:58738    wujek:0         LISTENING   11088
TCP    0.0.0.0:58739    wujek:0         LISTENING   11088

ご覧のとおり、アプリケーションは3つのポートを公開しました。 RMI/JMXは2つのポートを公開します。 3つ目は、ローカル接続用のランダムポートです。

5. 開くポートの数を制限する

まず、 -XX:+ DisableAttachMechanism オプションを使用して、JConsoleからのローカル接続用のアプリケーションの公開を無効にできます。

java -XX:+DisableAttachMechanism com.baeldung.jmx.JMXConfiguration

その後、アプリケーションはJMX/RMIポートを公開しません。

さらに、JDK 16から、ローカルポート番号を設定できます。

java 
  -Dcom.sun.management.jmxremote=true 
  -Dcom.sun.management.jmxremote.local.port=1235 
  com.baeldung.jmx.JMXConfiguration

次に、構成を変更して、リモートポートを試してみましょう。

追加のオプション-Dcom.sun.management.jmxremote.rmi.port=1234 があり、RMIポートをJMXポートと同じ値に設定できます。 現在、完全なコマンドは次のとおりです。

java 
  -Dcom.sun.management.jmxremote=true 
  -Dcom.sun.management.jmxremote.port=1234 
  -Dcom.sun.management.jmxremote.rmi.port=1234 
  -Dcom.sun.management.jmxremote.local.port=1235 
  -Dcom.sun.management.jmxremote.authenticate=false 
  -Dcom.sun.management.jmxremote.ssl=false 
  com.baeldung.jmx.JMXConfiguration

その後、netstatコマンドは次を返します。

Proto  Local Address    Foreign Address State       PID
TCP    0.0.0.0:1234     wujek:0         LISTENING   19504
TCP    0.0.0.0:1235     wujek:0         LISTENING   19504

つまり、アプリケーションは2つのポートのみを公開します。1つはJMX / RMIリモート接続用で、もう1つはローカル接続用です。 そのおかげで、公開されたポートを完全に制御し、他のプロセスによって公開されたポートとの競合を回避できます。

ただし、リモートからの接続を有効にし、接続メカニズムを無効にすると、次のようになります。

java 
  -XX:+DisableAttachMechanism 
  -Dcom.sun.management.jmxremote=true 
  -Dcom.sun.management.jmxremote.port=1234 
  -Dcom.sun.management.jmxremote.rmi.port=1234 
  -Dcom.sun.management.jmxremote.authenticate=false 
  -Dcom.sun.management.jmxremote.ssl=false 
  com.baeldung.jmx.JMXConfiguration

その後、アプリケーションは引き続き2つのポートを公開します。

Proto Local Address     Foreign Address     State       PID
TCP   0.0.0.0:1234      wujek:0             LISTENING   9856
TCP   0.0.0.0:60565     wujek:0             LISTENING   9856

6. 結論

この短い記事では、JavaでJMXを起動する方法について説明しました。 次に、起動時にJMXによって開かれるポートを示しました。 最後に、JMXによって開かれるポートの数を制限する方法を示しました。

いつものように、例のソースコードはGitHubから入手できます。