TomcatでJMXを有効化する方法まとめ|SSL設定・認証・監視ツール連携まで解説

はじめに

Java の代表的なアプリケーションサーバである Apache Tomcat は、実際のプロジェクトで広く利用されています。アプリケーションの稼働状況を把握するには、メモリ使用量、スレッド数、ガーベジコレクション(GC)の動作状況などを監視することが重要です。

これらの情報を取得するために利用できるのが JMX(Java Management Extensions) です。本記事では、Tomcat 上で JMX を有効化する方法と、接続して監視を行う手順について解説します。

JMXとは?

JMX(Java Management Extensions) は、Java アプリケーションのリソースや挙動を監視・管理するための仕組みです。JMXを利用することで、以下のような情報を取得できます。

  • メモリ情報(Heap / Non-Heap の使用量、GCの回数と時間)
  • スレッド情報(現在のスレッド数、デッドロック検出)
  • クラスローディング状況

監視ツール(jconsole, VisualVM, Datadog, Zabbix など)と連携すれば、アプリケーションの状態をリアルタイムに把握できるようになります。 MBean(Managed Bean) を介してアプリケーション内部の情報へのアクセスや操作を外部から実施することもできますが、本記事における説明は割愛します。

TomcatにおけるJMXの設定方法

TomcatにおけるJMXの設定方法を順を追って説明します。

setenv.shの設定

Tomcat の起動時に JMX を有効化するには、環境変数 CATALINA_OPTS に JMX 用のオプションを追加します。Linux 環境の場合は、$CATALINA_HOME/bin/setenv.sh を作成(または編集)して、以下を追記します。

[root@quiz ~]# vi /opt/tomcat/bin/setenv.sh
[root@quiz ~]# cat /opt/tomcat/bin/setenv.sh
export JAVA_HOME=/opt/java/jdk-21.0.2
export JRE_HOME=$JAVA_HOME
export PATH=$JAVA_HOME/bin:$PATH

# JMX setting
export JMX_KEYSTORE_PASS='XXXXXXXXXXX'

# JMX setting
CATALINA_OPTS="$CATALINA_OPTS \
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=9010 \
-Dcom.sun.management.jmxremote.rmi.port=9011 \
-Dcom.sun.management.jmxremote.authenticate=true \
-Dcom.sun.management.jmxremote.access.file=/opt/tomcat/conf/jmxremote.access \
-Dcom.sun.management.jmxremote.password.file=/opt/tomcat/conf/jmxremote.password \
-Dcom.sun.management.jmxremote.registry.ssl=true \
-Dcom.sun.management.jmxremote.ssl=true \
-Dcom.sun.management.jmxremote.ssl.need.client.auth=false \
-Dcom.sun.management.jmxremote.local.only=false \
-Djavax.net.ssl.keyStore=/opt/tomcat/conf/jmxkeystore.jks \
-Djavax.net.ssl.keyStorePassword=$JMX_KEYSTORE_PASS \
-Djava.rmi.server.hostname=quiz.eeengineer.com"
[root@quiz ~]#

それぞれの設定内容を説明します。

  • export JMX_KEYSTORE_PASS=’XXXXXXXXXXX’
    JMX通信をSSL(暗号化)で保護するための キーストアのパスワード を環境変数として定義しています。あとで -Djavax.net.ssl.keyStorePassword でこの値を参照します。
  • CATALINA_OPTS=”$CATALINA_OPTS \
    -Dcom.sun.management.jmxremote \

    JMXのリモート管理機能を有効にします。
  • -Dcom.sun.management.jmxremote.port=9010 \
    JMXにリモート接続を受け付けるためのポートを指定します。
  • -Dcom.sun.management.jmxremote.rmi.port=9011 \
    実際にデータ通信を行うRMI(※)ポートを指定します。上記の設定したポート9010で接続した後、以降のデータ通信のやり取りは本ポート9011で行われます。
    ※RMI:Remote Method Invocationの略で、別のJavaプロセスのメソッドをローカルのメソッドのように呼び出す機能となります。
  • -Dcom.sun.management.jmxremote.authenticate=true \
    JMXアクセスに対してユーザ名とパスワードによる認証を必須にします。後ほど、アクセス制御ファイルをパスワードファイルを別途作成します。
  • -Dcom.sun.management.jmxremote.access.file=/opt/tomcat/conf/jmxremote.access \
    ユーザごとのアクセス権限を制御するファイルを指定します。例えば「監視だけ可能なユーザ」と「操作も可能なユーザ」を分けることができます。これにより、必要最小限の権限で運用できます。
  • -Dcom.sun.management.jmxremote.password.file=/opt/tomcat/conf/jmxremote.password \
    JMX接続で使用するユーザ名とパスワードを記述したファイルの場所を指定します。ここで設定したユーザ名とパスワードでのみ接続可能になります。パスワードファイルは権限を制限し、外部から読めないようにしておくことが重要です。
  • -Dcom.sun.management.jmxremote.registry.ssl=true \
    JMXのRMIレジスト通信にSSLを使う設定です。クライアントからのアクセスをSSLで受け付けるようになります。
  • -Dcom.sun.management.jmxremote.ssl=true \
    JMXの実際のRMI通信にSSLを使う設定となります。
  • -Dcom.sun.management.jmxremote.ssl.need.client.auth=false \
    SSL接続時に、クライアント側の証明書を必須としない設定です。よりセキュリティ強度を高めたい場合は、設定を有効にしてみて下さい。
  • -Dcom.sun.management.jmxremote.local.only=false \
    ローカル(同一マシン)以外からのJMX接続を許可する設定です。
  • -Djavax.net.ssl.keyStore=/opt/tomcat/conf/jmxkeystore.jks \
    SSL証明書を格納したKeystoreの場所を指定します。TomcatがSSL通信を行う際、このKeystoreから証明書を読み込みます。
  • -Djavax.net.ssl.keyStorePassword=$JMX_KEYSTORE_PASS \
    Keystoreのパスワードを設定します。この例では環境変数$JMX_KEYSTORE_PASSを利用しているため、設定ファイルに平文で書かずに済み、セキュリティリスクを低減できます。
  • -Djava.rmi.server.hostname=quiz.eeengineer.com”
    JMX接続時にクライアントがアクセスするホスト名を指定します。内部IPではなく、外部や固定ホスト名を指定することで、RMI通信が正しく行えるようになります。

認証ファイルの作成

JMXのリモートアクセス用の認証情報を指定するためにsetenv .shで指定したパスにjmxremote.access とjmxremote.password を作成します。

jmxremote.access
ユーザごとのアクセス権限を設定するファイルです。ここでは、読み取り専用ユーザと、読み書き可能なユーザを作成しています。

[root@quiz ~]# vi /opt/tomcat/conf/jmxremote.access
[root@quiz ~]# cat /opt/tomcat/conf/jmxremote.access
monitorRole readonly
adminRole readwrite
[root@quiz ~]#

ファイルのオーナーをtomcat、パーミッションを600に変更して下さい。

[root@quiz ~]# chown tomcat:tomcat /opt/tomcat/conf/jmxremote.access
[root@quiz ~]# chmod 600 /opt/tomcat/conf/jmxremote.access
[root@quiz ~]# ls -l /opt/tomcat/conf/jmxremote.access
-rw------- 1 tomcat tomcat 25 Oct  7 06:44 /opt/tomcat/conf/jmxremote.access
[root@quiz ~]#

・jmxremote.password
ユーザ名とパスワードを紐付けるファイルとなります。jmxremote.accessに記載したユーザに対して適切なパスワードを指定してください。

[root@appserver ~]# vi /opt/tomcat/conf/jmxremote.password
[root@appserver ~]# cat /opt/tomcat/conf/jmxremote.password
monitorRole YYYYYYYYYYY
adminRole ZZZZZZZZZZ

ファイルのオーナーをtomcat、パーミッションを600に変更して下さい。

[root@quiz ~]# chown tomcat:tomcat /opt/tomcat/conf/jmxremote.password
[root@quiz ~]# chmod 600 /opt/tomcat/conf/jmxremote.password
[root@quiz ~]# ls -l /opt/tomcat/conf/jmxremote.password
-rw------- 1 tomcat tomcat 25 Oct  7 06:44 /opt/tomcat/conf/jmxremote.password
[root@quiz ~]

SSL/TLS証明書の作成

今回は、自己証明書を作成する方法をご紹介します。本番環境に適用する場合は、正式なCA(認証局)から発行された証明書を利用することを推奨します。

下記の通り、keytoolコマンドで証明書を作成してtomcatに配置します。

[root@quiz ~]# keytool -genkeypair \
-alias jmx \
-keyalg RSA \
-keysize 2048 \
-validity 3650 \
-keystore /opt/tomcat/conf/jmxkeystore.jks \
-storepass AAAAAAAAAAA\
-keypass AAAAAAAAAAA\
-dname "CN=quiz.eeengineer.com, OU=IT, O=eeengineer company, L=Tokyo, ST=Tokyo, C=JP"
Generating 2,048 bit RSA key pair and self-signed certificate (SHA384withRSA) with a validity of 3,650 days
for: CN=quiz.eeengineer.com, OU=IT, O=eeengineer company, L=Tokyo, ST=Tokyo, C=JP
[root@appserver ~]#

ファイルのオーナーをtomcat、パーミッションを600に変更して下さい。

[root@quiz ~]# chown tomcat:tomcat /opt/tomcat/conf/jmxkeystore.jks
[root@quiz ~]# chmod 600 /opt/tomcat/conf/jmxkeystore.jks
[root@quiz ~]# ls -l /opt/tomcat/conf/jmxkeystore.jks
-rw------- 1 tomcat tomcat 2738 Oct  9 06:43 /opt/tomcat/conf/jmxkeystore.jks
[root@quiz ~]#

設定反映

上記の設定を反映させるために、tomcatを再起動します。

[root@quiz ~]# systemctl restart tomcat
[root@quiz ~]# systemctl status tomcat
● tomcat.service - Apache Tomcat 10
Loaded: loaded (/etc/systemd/system/tomcat.service; enabled; preset: disabled)
Active: active (exited) since Thu 2025-10-09 06:46:46 JST; 6s ago
Process: 105743 ExecStart=/opt/tomcat/bin/startup.sh (code=exited, status=0/SUCCESS)
Main PID: 105743 (code=exited, status=0/SUCCESS)
Tasks: 0 (limit: 23143)
Memory: 4.5M
CPU: 3.745s
CGroup: /system.slice/tomcat.service

Oct 09 06:46:46 quiz systemd[1]: Starting Apache Tomcat 10...
Oct 09 06:46:46 quiz [startup.sh](http://startup.sh/)[105743]: Tomcat started.
Oct 09 06:46:46 quiz systemd[1]: Finished Apache Tomcat 10.
[root@quiz ~]#

JMXが設定したportで受付をしていることを下記の通り確認してください。

[root@quiz ~]# ss -tulnp | grep 9010                            
tcp   LISTEN 0      50                      *:9010             *:*    users:(("java",pid=103023,fd=12))                                                                                         
[root@quiz ~]#
[root@quiz ~]# ss -tulnp | grep 9011
tcp   LISTEN 0      50                      *:9011             *:*    users:(("java",pid=103023,fd=10))                                                                                         
[root@quiz ~]#

クライアントへの証明書配置

接続元のクライアントに証明書を配置する手順をご説明します。

まず、サーバにて証明書をエクスポートします。

[root@quiz ~]# keytool -exportcert \
-alias jmx \
-keystore /opt/tomcat/conf/jmxkeystore.jks \
-file /opt/tomcat/conf/jmx.cer
Enter keystore password:
Certificate stored in file </opt/tomcat/conf/jmx.cer>

格納された証明書をWinSCP等でクライアントにダウンロードした後、クライアント側のキーストアに証明書を追加します。

C:\Windows\System32>keytool -importcert -trustcacerts -alias quiz.eeengineer.com -file "C:\Users\user\Desktop\jmx.cer" -keystore "C:\Program Files (x86)\jdk-21\lib\security\cacerts" -storepass changeit
Trust this certificate? [no]:  y
Certificate was added to keystore

下記の通り、キーストアに証明書が登録されたことを確認してください。

C:\Windows\System32> keytool -list -cacerts -storepass changeit | findstr quiz.eeengineer.com
quiz.eeengineer.com,2025/10/12, trustedCertEntry,

ネットワーク制御

JMXに外部(インターネット)からアクセスできるようにする場合、Tomcatのパスワード認証だけに依存するのは非常に危険です。万が一、パスワードが漏洩したり総当たり攻撃を受けたりすると、不正アクセスのリスクが高まります。

そのため、ネットワーク制御を組み合わせて利用することが強く推奨されます。具体的には、ファイアウォールやセキュリティグループなどを活用し、特定のクライアントIPアドレスからのみアクセスを許可するように設定してください。

一例として、Linuxサーバにおけるファイアウォール設定を有効にして、特定のクライアントからの接続のみを許可する設定を追加します。こうした多層的なセキュリティ対策を講じることで、JMXの利用に伴うリスクを大幅に低減できます。

[root@quiz ~]# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="106.42.143.133" port protocol="tcp" port="9010" accept'
success
[root@quiz ~]# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="106.42.143.133" port protocol="tcp" port="9011" accept'
success
[root@quiz ~]# firewall-cmd --reload
success
[root@quiz ~]#

jConsoleによる情報取得

JDK に含まれる jConsole を利用して Tomcat に接続できます。コマンドプロンプトから jConsole を起動しましょう。

Microsoft Windows [Version 10.0.26100.6584]
(c) Microsoft Corporation. All rights reserved.

C:\Users\user>jconsole -J-Duser.language=en -J-Duser.country=US

C:\Users\user>

下記の通り、jConsoleが起動されれば成功です。Remote Processに必要な接続情報を入力し、”Connect”を押下します。

下記の通り、各種リソース情報が取得できることを確認できれば成功です。

ためしにtomcatに負荷をかけてリソース使用状況の変化を観測してみると面白いです。Jmeterによる負荷テストのやり方を紹介しているので、興味がある方は見てみてください。
初心者でもわかる!JMeterを使ったWebシステムの負荷テスト入門

※サーバ側とクライアント側でJDKのバージョンが異なる場合、jConsole経由で接続できないことがあります。可能であれば、両者のJDKバージョンを統一してください。
※読み取り専用ユーザーで接続すると、一部のMBean情報を取得できない場合があります。その場合は、読み書き権限を持つユーザーで再接続してください。

JMXで取得した情報の定期出力

JMXは、jConsoleなどのGUIツールで確認するだけでなく、コマンドラインから定期的に情報を取得し、ファイルに出力することも可能です。
ここでは、JMX経由でJavaアプリケーションに接続し、MBeanの情報を取得・操作できるコマンドラインツール「JMXTerm」を使った方法を紹介します。

JMXTerm向けの設定

現時点でJMXTermはSSL通信をサポートしていないようで、SSLを有効にしたままだとJMXにアクセスできません。下記の通り、SSLの設定を無効にしてください。

  • 変更
    -Dcom.sun.management.jmxremote.registry.ssl=false \
    -Dcom.sun.management.jmxremote.ssl=false \
  • 削除
    -Dcom.sun.management.jmxremote.ssl.need.client.auth=false \
    -Djavax.net.ssl.keyStore=… \
    -Djavax.net.ssl.keyStorePassword=…
[root@quiz ~]# cat /opt/tomcat/bin/setenv.sh
export JAVA_HOME=/opt/java/jdk-21.0.2
export JRE_HOME=$JAVA_HOME
export PATH=$JAVA_HOME/bin:$PATH

#JMX setting
export JMX_KEYSTORE_PASS='JhB8MV2zyVpS'

# JMX setting
CATALINA_OPTS="$CATALINA_OPTS \
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=9010 \
-Dcom.sun.management.jmxremote.rmi.port=9011 \
-Dcom.sun.management.jmxremote.authenticate=true \
-Dcom.sun.management.jmxremote.access.file=/opt/tomcat/conf/jmxremote.access \
-Dcom.sun.management.jmxremote.password.file=/opt/tomcat/conf/jmxremote.password \
-Dcom.sun.management.jmxremote.registry.ssl=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.local.only=false \
-Djava.rmi.server.hostname=quiz.eeengineer.com"
[root@quiz ~]#
[root@quiz ~]# systemctl restart tomcat
[root@quiz ~]# 

JMXTermのダウンロード・動作確認

適当なディレクトリを作成して、JMXTermのjarファイルをダウンロードします。

[root@quiz ~]# mkdir -p /opt/tomcat/tool
[root@quiz ~]# cd /opt/tomcat/tool/
[root@quiz tool]# wget https://github.com/jiaqi/jmxterm/releases/download/v1.0.0/jmxterm-1.0.0-uber.jar
--2025-10-15 06:01:01--  https://github.com/jiaqi/jmxterm/releases/download/v1.0.0/jmxterm-1.0.0-uber.jar
Resolving github.com (github.com)... 140.82.121.3
Connecting to github.com (github.com)|140.82.121.3|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://release-assets.githubusercontent.com/github-production-release-asset/1848246/442e150e-73c7-11e7-80ef-736971bc0400?sp=r&sv=2018-11-09&sr=b&spr=https&se=2025-10-14T21%3A53%3A54Z&rscd=attachment%3B+filename%3Djmxterm-1.0.0-uber.jar&rsct=application%2Foctet-stream&skoid=96c2d410-5711-43a1-aedd-ab1947aa7ab0&sktid=398a6654-997b-47e9-b12b-9515b896b4de&skt=2025-10-14T20%3A53%3A18Z&ske=2025-10-14T21%3A53%3A54Z&sks=b&skv=2018-11-09&sig=93LJ0%2BRENCbRq0iGRplUw%2F57rIW9mvv7fPS0J52yANk%3D&jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmVsZWFzZS1hc3NldHMuZ2l0aHVidXNlcmNvbnRlbnQuY29tIiwia2V5Ijoia2V5MSIsImV4cCI6MTc2MDQ3NTk2MiwibmJmIjoxNzYwNDc1NjYyLCJwYXRoIjoicmVsZWFzZWFzc2V0cHJvZHVjdGlvbi5ibG9iLmNvcmUud2luZG93cy5uZXQifQ.SkugKOim30eOHxq2krHbkACsNZa_GJPYjERrUfH3DBY&response-content-disposition=attachment%3B%20filename%3Djmxterm-1.0.0-uber.jar&response-content-type=application%2Foctet-stream [following]
--2025-10-15 06:01:02--  https://release-assets.githubusercontent.com/github-production-release-asset/1848246/442e150e-73c7-11e7-80ef-736971bc0400?sp=r&sv=2018-11-09&sr=b&spr=https&se=2025-10-14T21%3A53%3A54Z&rscd=attachment%3B+filename%3Djmxterm-1.0.0-uber.jar&rsct=application%2Foctet-stream&skoid=96c2d410-5711-43a1-aedd-ab1947aa7ab0&sktid=398a6654-997b-47e9-b12b-9515b896b4de&skt=2025-10-14T20%3A53%3A18Z&ske=2025-10-14T21%3A53%3A54Z&sks=b&skv=2018-11-09&sig=93LJ0%2BRENCbRq0iGRplUw%2F57rIW9mvv7fPS0J52yANk%3D&jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmVsZWFzZS1hc3NldHMuZ2l0aHVidXNlcmNvbnRlbnQuY29tIiwia2V5Ijoia2V5MSIsImV4cCI6MTc2MDQ3NTk2MiwibmJmIjoxNzYwNDc1NjYyLCJwYXRoIjoicmVsZWFzZWFzc2V0cHJvZHVjdGlvbi5ibG9iLmNvcmUud2luZG93cy5uZXQifQ.SkugKOim30eOHxq2krHbkACsNZa_GJPYjERrUfH3DBY&response-content-disposition=attachment%3B%20filename%3Djmxterm-1.0.0-uber.jar&response-content-type=application%2Foctet-stream
Resolving release-assets.githubusercontent.com (release-assets.githubusercontent.com)... 185.199.111.133, 185.199.108.133, 185.199.110.133, ...
Connecting to release-assets.githubusercontent.com (release-assets.githubusercontent.com)|185.199.111.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2069780 (2.0M) [application/octet-stream]
Saving to: ‘jmxterm-1.0.0-uber.jar’

jmxterm-1.0.0-uber.jar                                     100%[=====================================================================================================================================>]   1.97M  --.-KB/s    in 0.09s

2025-10-15 06:01:02 (22.5 MB/s) - ‘jmxterm-1.0.0-uber.jar’ saved [2069780/2069780]

[root@quiz tool]# ll jmxterm-1.0.0-uber.jar
-rw-r--r-- 1 root root 2069780 Dec  7  2021 jmxterm-1.0.0-uber.jar
[root@quiz tool]#

java -jar コマンドで jarファイルを実行します。

[root@quiz tool]# java -jar jmxterm-1.0.0-uber.jar
Welcome to JMX terminal. Type "help" for available commands.
$>

先ほどのJMXTermの追加設定にて指定したポート番号を指定して、下記の通りJMXにアクセスします。

$>open 127.0.0.1:9010 -u adminRole -p vYd$Rd-M34mf
#Connection to 127.0.0.1:9012 is opened
$>

beansコマンドを実行すると、下記の通り取得可能な情報の一覧を表示可能です。

$>beans
#domain = Catalina:
Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/,j2eeType=Filter,name=Tomcat WebSocket (JSR356) Filter
Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/,j2eeType=Filter,name=characterEncodingFilter

... [output truncated] ...

Catalina:type=StringCache
Catalina:type=UtilityExecutor
#domain = JMImplementation:
JMImplementation:type=MBeanServerDelegate
#domain = Users:
Users:database=UserDatabase,type=UserDatabase
#domain = com.sun.management:
com.sun.management:type=DiagnosticCommand
com.sun.management:type=HotSpotDiagnostic
#domain = java.lang:
java.lang:name=CodeCacheManager,type=MemoryManager
java.lang:name=CodeHeap 'non-nmethods',type=MemoryPool
java.lang:name=CodeHeap 'non-profiled nmethods',type=MemoryPool
java.lang:name=CodeHeap 'profiled nmethods',type=MemoryPool
java.lang:name=Compressed Class Space,type=MemoryPool
java.lang:name=G1 Concurrent GC,type=GarbageCollector
java.lang:name=G1 Eden Space,type=MemoryPool
java.lang:name=G1 Old Gen,type=MemoryPool
java.lang:name=G1 Old Generation,type=GarbageCollector
java.lang:name=G1 Survivor Space,type=MemoryPool
java.lang:name=G1 Young Generation,type=GarbageCollector
java.lang:name=Metaspace Manager,type=MemoryManager
java.lang:name=Metaspace,type=MemoryPool
java.lang:type=ClassLoading
java.lang:type=Compilation
java.lang:type=Memory
java.lang:type=OperatingSystem
java.lang:type=Runtime
java.lang:type=Threading
#domain = java.nio:
java.nio:name=direct,type=BufferPool
java.nio:name=mapped - 'non-volatile memory',type=BufferPool
java.nio:name=mapped,type=BufferPool
#domain = java.util.logging:
java.util.logging:type=Logging
#domain = jdk.management.jfr:
jdk.management.jfr:type=FlightRecorder
$>

ヒープメモリ

ヒープメモリに関する情報を取得する方法をご紹介します。

>$>domain java.lang
#domain is set to java.lang
$>bean java.lang:type=Memory
#bean is set to java.lang:type=Memory
$>get HeapMemoryUsage
#mbean = java.lang:type=Memory:
HeapMemoryUsage = {
  committed = 114294784;
  init = 60817408;
  max = 958398464;
  used = 58177952;
 };

$>

以下の情報が取得することができます。

  • init:JVM 起動時に確保されたヒープメモリ量
  • used:現在使用中のヒープメモリ量
  • committed:JVM が OS から確保済みのメモリ量(used ≤ committed ≤ max)
  • max:JVM が使用できる最大ヒープサイズ(上限)

スレッド数

スレッド数を取得する方法をご紹介します。

$>bean java.lang:type=Threading
#bean is set to java.lang:type=Threading
$>
$>get ThreadCount
#mbean = java.lang:type=Threading:
ThreadCount = 35;

$>
$>get PeakThreadCount
#mbean = java.lang:type=Threading:
PeakThreadCount = 159;

以下の情報が取得することができます。

  • ThreadCount:生成中のスレッド数
    ※JMXでは実行中(runnable)のスレッド数は取得できません。jcmd コマンドなどを使って情報取得してください。
  • PeakThreadCount:JVM起動後の最大スレッド生成数

スクリプトの定期実行

JMXTermをシェルスクリプトで定期実行することで、メモリやスレッド数などの情報を一定間隔でファイルに出力できます。以下は1分ごとにメモリ使用量を取得し、ログに追記する例です。

[root@quiz ~]# mkdir -p /opt/scripts
[root@quiz ~]# mkdir -p /var/log/jmx
[root@quiz ~]# vi /opt/scripts/jmx_heap_memory.sh
[root@quiz ~]# cat /opt/scripts/jmx_heap_memory.sh
#!/bin/bash
LOG_FILE="/var/log/jmx/jmx_metrics.log"
JMXTERM="/opt/tomcat/tool/jmxterm-1.0.0-uber.jar"

echo "===== $(date) =====" >> "$LOG_FILE"

java -jar "$JMXTERM" -l quiz.eeengineer.com:9010 \
  -u adminRole -p 'vYd$Rd-M34mf' -n -v silent <<EOF >> "$LOG_FILE"
sleep 3
bean java.lang:type=Memory
get HeapMemoryUsage
exit
EOF

echo "" >> "$LOG_FILE"
[root@quiz ~]#
[root@quiz ~]# chmod +x /opt/scripts/jmx_heap_memory.sh
[root@quiz ~]# ls -l /opt/scripts/jmx_heap_memory.sh
-rwxr-xr-x 1 root root 306 Oct 16 06:03 /opt/scripts/jmx_heap_memory.sh
[root@quiz ~]#

続いてcrontabを編集し、1分間隔で実行するように設定します。

[root@quiz ~]# crontab -e
no crontab for root - using an empty one
crontab: installing new crontab
[root@quiz ~]# crontab -l
* * * * * /opt/scripts/jmx_heap_memory.sh
[root@quiz ~]#

ログに情報が出力されていることを確認しましょう。

[root@quiz ~]# tail -f /var/log/jmx/jmx_metrics.log
===== Fri Oct 17 06:52:01 AM JST 2025 =====
HeapMemoryUsage = {
  committed = 99614720;
  init = 60817408;
  max = 958398464;
  used = 89295816;
 };


===== Fri Oct 17 06:53:01 AM JST 2025 =====
HeapMemoryUsage = {
  committed = 99614720;
  init = 60817408;
  max = 958398464;
  used = 89295816;
 };

まとめ

本記事では、Apache Tomcat 上で JMX を有効化し、リモート監視と定期的な情報取得を行う手順を解説しました。ポイントは以下の通りです。

  1. JMX有効化
    • setenv.shCATALINA_OPTS を設定し、リモート管理を有効化
    • ポート・認証・RMI・SSL設定を適切に行う
  2. 認証とセキュリティ
    • jmxremote.accessjmxremote.password でアクセス権限とユーザ管理
    • ファイアウォールで特定IPのみアクセス許可
  3. SSL証明書
    • 自己署名またはCA発行証明書で通信を暗号化
    • サーバ・クライアント間で安全な接続を確保
  4. 監視と定期取得
    • jConsoleJMXTerm でメモリ・スレッド・GC状況を確認
    • スクリプト+cronで定期的にヒープ使用量などをログ出力可能

これにより、Tomcat の稼働状況を安全に監視し、障害予兆の検知や運用効率化に活用できます。

コメント