Java Platform Standard Edition

モニタリングおよび管理ガイド

リリース9

E90924-01(原本部品番号:E75744-02)

2017年9月

このガイドでは、Javaのモニタリングと管理用のユーティリティについて説明します。

Java Platform, Standard Editionモニタリングおよび管理ガイド, リリース9

E90924-01

Copyright © 2006, 2017, Oracle and/or its affiliates. All rights reserved.

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクル社までご連絡ください。

このソフトウェアまたは関連ドキュメントを、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供する場合は、次の通知が適用されます。

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs.No other rights are granted to the U.S. Government.

このソフトウェアもしくはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアもしくはハードウェアは、危険が伴うアプリケーション(人的傷害を発生させる可能性があるアプリケーションを含む)への用途を目的として開発されていません。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用する際、安全に使用するために、適切な安全装置、バックアップ、冗長性(redundancy)、その他の対策を講じることは使用者の責任となります。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

OracleおよびJavaはOracle Corporationおよびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXは、The Open Groupの登録商標です。

このソフトウェアまたはハードウェア、そしてドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。適用されるお客様とOracle Corporationとの間の契約に別段の定めがある場合を除いて、Oracle Corporationおよびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。適用されるお客様とOracle Corporationとの間の契約に定めがある場合を除いて、Oracle Corporationおよびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても一切の責任を負いかねます。

目次

タイトルおよび著作権情報

はじめに

- 対象読者

- ドキュメントのアクセシビリティについて

- 関連ドキュメント

- 表記規則

1 Java SEモニタリングおよび管理の概要

- 主なモニタリングおよび管理機能

- Java仮想マシンのインストゥルメンテーション

- モニタリングおよび管理API

- モニタリングおよび管理ツール

- Java Management Extensionsテクノロジ

- MBeanとは

- MBeanサーバー

- MBeanの作成および登録

- アプリケーションの計測

- プラットフォームMXBean

- プラットフォームMBeanサーバー

2 JMXテクノロジを使用するモニタリングと管理

- システム・プロパティの設定

- すぐに使用できる管理の有効化

- ローカル・モニタリングおよび管理

- JConsoleを使用したローカル・モニタリングおよび管理

- リモート・モニタリングおよび管理

- パスワード認証の使用

- LDAP認証の使用

- ファイルベースのパスワード認証の使用

- パスワード認証の無効化

- SSLの使用

- RMIレジストリ認証の有効化

- SSLクライアント認証の有効化

- SSLの無効化

- セキュリティの無効化

- JConsoleによるリモート・モニタリング

- JConsoleによるリモート・モニタリング(SSLが有効な場合)

- パスワードとアクセス・ファイルの使用

- パスワード・ファイル

- アクセス・ファイル

- JConsoleによるリモート・モニタリング(SSLが無効な場合)

- すぐに使用できるモニタリングと管理のプロパティ

- 構成エラー

- プログラムによるJMXエージェントへの接続

- プログラムによるモニタリングおよび管理の設定

- JMXリモートAPIによるすぐに使用できる管理の模倣

- すぐに使用できる管理の模倣の例

- ファイアウォールを介したアプリケーションのモニタリング

- エージェント・クラスを使用するアプリケーションの計測

- アプリケーションを計測するエージェント・クラスの作成

3 JConsoleの使用

- JConsoleの起動

- コマンド構文

- ローカル・モニタリングの設定

- リモート・モニタリングの設定

- セキュアなリモート・モニタリングの設定

- JMXエージェントへの接続

- JConsoleのローカル・プロセスへの接続

- JConsoleのリモート・プロセスへの接続

- JMXサービスURLを使用する接続

- JConsoleタブの表示

- 概要情報の表示

- 図表データの保存

- メモリー消費のモニタリング

- ヒープおよび非ヒープのメモリー

- メモリー・プールとメモリー・マネージャ

- ガベージ・コレクション

- スレッドの使用のモニタリング

- デッドロックに陥ったスレッドの検出

- クラス・ローディングのモニタリング

- VM情報の表示

- MBeanのモニタリングと管理

- MBeanツリーの作成

- MBean属性

- MBeanの操作

- MBeanの通知

- HotSpot Diagnostic MXBean

- カスタム・タブの作成

4 プラットフォームMBeanサーバーとプラットフォームMXBeanの使用

- プラットフォームMBeanサーバーの使用

- プラットフォームMXBeanへのアクセス

- ManagementFactoryクラスを使用したプラットフォームMXBeanへのアクセス

- MXBeanプロキシを使用したプラットフォームMXBeanへのアクセス

- MBeanServerConnectionクラスを使用したプラットフォームMXBeanへのアクセス

- Oracle JDKのプラットフォーム拡張機能の使用

- MXBeanの各種属性に対する直接アクセス

- MBeanServerConnectionを使用したMXBean属性へのアクセス

- スレッドの競合およびCPU時間のモニタリング

- オペレーティング・システムの管理

- ロギングの管理

- ロー・メモリーの検出

- メモリーしきい値

- 使用量しきい値

- コレクション使用量しきい値

- メモリーMXBean

- メモリー・プールMXBean

- ポーリング

- しきい値通知

5 SNMPモニタリングと管理

- SNMPエージェントの有効化

- アクセス・コントロール・リスト・ファイル

- シングル・ユーザー環境においてSNMPエージェントを有効にする方法

- マルチユーザー環境においてSNMPエージェントを有効にする方法

- SNMPモニタリングと管理のプロパティ

- 構成エラー

6 Java Discovery Protocol (JDP)

はじめに

Java Platform, Standard Edition 9 (Java SE 9)は、Java仮想マシン(Java VM)およびそこで実行されるJavaアプリケーションのパフォーマンスのモニターと管理を可能にする様々なユーティリティを備えています。『Java SEモニタリングおよび管理ガイド』では、そのようなモニタリングおよび管理のユーティリティについて説明します。

対象読者

このガイドは、システム管理者やソフトウェア開発者など、Java言語の経験を持ち、Javaプラットフォームおよびそこで使用されるアプリケーションのパフォーマンスを非常に重要とするユーザーを対象としています。

ドキュメントのアクセシビリティについて

Oracleのアクセシビリティについての詳細情報は、Oracle Accessibility ProgramのWebサイト(http://www.oracle.com/pls/topic/lookup?ctx=acc&id=docacc)を参照してください。

Oracle Supportへのアクセス

サポートをご購入のOracleのお客様は、My Oracle Supportにアクセスして電子サポートを受けることができます。詳細情報は(http://www.oracle.com/pls/topic/lookup?ctx=acc&id=info) か、聴覚に障害のあるお客様は (http://www.oracle.com/pls/topic/lookup?ctx=acc&id=trs)を参照してください。

関連ドキュメント

その他のJDK 9のガイドについては、Oracle JDK 9のドキュメントを参照してください。

表記規則

このマニュアルでは次の表記規則を使用します。

規則

意味

太字

太字は、操作に関連するGraphical User Interface要素、または本文中で定義されている用語および用語集に記載されている用語を示します。

イタリック体

イタリックは、ユーザーが特定の値を指定するプレースホルダ変数を示します。

固定幅フォント

固定幅フォントは、段落内のコマンド、URL、サンプル内のコード、画面に表示されるテキスト、または入力するテキストを示します。

1 Java SEモニタリングおよび管理の概要

このトピックでは、Java Platform, Standard Edition (Java SEプラットフォーム)にモニタリングと管理のサービスを提供する機能およびユーティリティを説明します。

主なモニタリングおよび管理機能

Java SEプラットフォームには、重要なモニタリングおよび管理機能が用意されています。これらの機能は、大きく4つに分類されます。

- Java仮想マシンのインストゥルメンテーション

- モニタリングおよび管理API

- モニタリングおよび管理ツール

- Java Management Extensionsテクノロジ

Java仮想マシンのインストゥルメンテーション

Java仮想マシン(Java VM)は、モニタリングおよび管理を目的として計測され、ローカル・アクセスやリモート・アクセスを実現する組込み型の(または、すぐに使用できる)管理機能を有効にします。

JMXテクノロジを使用するモニタリングと管理およびSNMPモニタリングと管理を参照してください。

Java VMには、Java Management Extensions (JMX)仕様に準拠した管理アプリケーションで使用されるプラットフォームMBeanサーバーとプラットフォームMBeanが用意されています。これらのプラットフォームは、モニタリングおよび管理APIの実装です。プラットフォームMXBeanとMBeanサーバーについては、プラットフォームMXBeanおよびプラットフォームMBeanサーバーのトピックを参照してください。

モニタリングおよび管理API

Java SE にはモニタリングと管理を行うための次のAPIが含まれています。

- java.lang.management: Java仮想マシンおよびその基盤となるオペレーティング・システムのモニタリングと管理を有効にします。このAPIにより、アプリケーションによる自己モニターが可能になり、JMXに準拠したツールで仮想マシンのモニターと管理をローカルおよびリモートに行うことができます。このAPIでは、次の種類の情報にアクセスします。

- ロードされたクラスと実行中のスレッドの数

- Java VMの稼働時間、システム・プロパティ、VM入力引数

- スレッド状態、スレッド競合統計、ライブ・スレッドのスタック・トレース

- メモリー消費

- ガベージ・コレクションの統計

- ロー・メモリーの検出

- オンデマンド・デッドロックの検出

- オペレーティング・システム情報

- java.util.logging.LoggingMXBean: ログ情報の取得と設定ができます。

- Attach: 管理エージェントを仮想マシンに動的にロードできます。

- JConsole: JConsoleにアクセスするプログラム・インタフェース(JConsoleプラグインの追加など)を提供します。JTopはJConsoleプラグインの一例で、JDK_HOME/demo/management/JTopディレクトリにあります。

モニタリングおよび管理ツール

Java SEプラットフォームには、 JConsoleと呼ばれるモニタリング用グラフィカル・ツールが用意されています。JConsoleは、JMX APIを実装し、Java VMと計測されたアプリケーションのパフォーマンスのモニターを可能にします。パフォーマンスの最適化に役立つ情報が提供されます。

JConsoleの拡張機能には、次のようなものがあります。

- JConsoleプラグイン・サポート: 独自のプラグインを作成してJConsoleで実行することを可能にします。たとえば、アプリケーションのMBeanにアクセスするために、カスタム・タブを追加できます。

- 動的接続機能: Attach APIをサポートする任意のアプリケーションにJConsoleを接続できるようにします。

- 強化されたユーザー・インタフェース: データ・アクセスをさらに簡単にします。

- 新しい「概要」タブおよび「VMの概要」タブ: 使用中のJava VMに関する全体情報をよりわかりやすく表示します。

- HotSpot診断MBean: 実行時にヒープ・ダンプを要求し、また一部のVMオプションの設定変更を行うAPIが用意されています。

- 強化されたMBeanプレゼンテーション: MBeanの操作や属性に対するアクセスを簡単にします。

JConsoleの詳細は、JConsoleの使用のトピックを参照してください。

ほかのコマンド行ツールは、Java SEプラットフォームでも使用することができます。

Java Management Extensionsテクノロジ

Java SEプラットフォームのリリース9には、Java Management Extensions (JMX)仕様バージョン1.4が含まれています。JMX APIでは、モニタリングおよび管理を行うアプリケーションを計測することができます。Remote Method Invocation (RMI)コネクタでは、JConsoleなどを使用して、この計測へのリモート・アクセスが可能となります。

Java Platform, Standard Edition Java Management ExtensionsガイドのJMXテクノロジのドキュメントを参照してください。

次の項では、JMX APIの主なコンポーネントの概要について説明します。

MBeanとは

JMXテクノロジのMBeanは、managed beans、すなわち管理されるリソースを表すJavaオブジェクトです。MBeanには管理インタフェースが設けられており、このインタフェースは次の要素で構成されます。

- 読出しや書込み可能な名前付きおよび型付き属性。

- 呼出し可能な名前付きおよび型付き操作。

- MBeanが送出可能な型付き通知。

たとえば、アプリケーションの構成を表すMBeanには、CacheSizeなどの様々な構成パラメータを表す属性が用意されています。CacheSize属性を読み取ることにより、現在のキャッシュ・サイズが返されます。CacheSizeの書込みを行うと、キャッシュのサイズが更新され、実行中のアプリケーションの動作が変わる可能性があります。saveなどの操作では、現在の構成が永続的に格納されます。構成が変更されたときは、MBeanからConfigurationChangedNotificationなどの通知を送信できます。

MBeanは、標準または動的なものとなります。標準MBeanは、JavaBeansコンポーネント・モデルに由来する、設計パターンに準拠したJavaオブジェクトです。動的MBeanでは、実行時にその管理インタフェースを定義します。MXBeanと呼ばれる別の種類のMBeanもJavaプラットフォームに追加されています。

- 標準MBeanでは、その属性と操作を通じて直接管理を行うリソースが公開されます。属性は、getterメソッドやsetterメソッドを通じて公開されます。操作は、クラスのその他のメソッドのうち、管理側で利用可能なメソッドです。これらのメソッドはすべてMBeanインタフェースに静的に定義されており、JMXエージェントでは、イントロスペクションを通じてこれらのメソッドを確認できます。このメソッドが新しいリソースを管理可能にする最もわかりやすい方法です。

- 動的MBeanは、その管理インタフェースを実行時に定義するMBeanです。たとえば、構成MBeanは、XMLファイルの解析により、公開する属性の名前と型を決定します。

- MXBeanはMBeanの一種であり、定義済の型セットのみを参照するMBeanのコーディングを簡単に行う方法を提供します。この方法では、任意のクライアントがMBeanを使用できます。これにはリモート・クライアントが含まれ、MBeanの種類を示すモデル固有のクラスにアクセスする必要はありません。プラットフォームMBeanは、すべてMXBeanです。

MBeanサーバー

有効にするには、MBeanをMBeanサーバーに登録する必要があります。MBeanサーバーは、MBeanのリポジトリです。各MBeanは、MBeanサーバー内の一意の名前を使用して登録されます。MBeanには、通常MBeanサーバーを経由してのみアクセスします。すなわち、コードはMBeanに直接アクセスするのではなく、名前を使用することにより、MBeanサーバー経由でMBeanにアクセスします。

Java SEプラットフォームには、組込み型のプラットフォームMBeanサーバーが含まれています。プラットフォームMBeanサーバーとプラットフォームMXBeanの使用を参照してください。

MBeanの作成および登録

MBeanは2とおりの方法で作成できます。1つ目の方法では、MBeanであるJavaオブジェクトを作成し、registerMBeanメソッドでそのオブジェクトをMBeanサーバーに登録します。もう1つのメソッドでは、createMBeanメソッドの1つを使用して単一の操作でMBeanの作成および登録を行います。

registerMBeanメソッドは、ローカルでの使用を目的とした単純な構造となっていますが、リモートで使用することはできません。createMBeanメソッドはリモートで使用できますが、場合によってクラス・ローディングの問題に注意を払う必要があります。MBeanサーバーでMBeanRegistrationインタフェースを実装している状態でMBeanをそのMBeanサーバーに登録またはそのサーバーから登録解除するときは、そのMBeanでアクションを実行することができます。

アプリケーションの計測

JMX APIで管理用アプリケーションを計測する一般的な手順については、ほかのドキュメントを参照してください。

プラットフォームMXBean

プラットフォームMXBeanは、Java VMに加え、Java Runtime Environment (JRE)のその他のコンポーネントをモニタリングおよび管理するMBeanです。各MXBeanでは、クラス・ローディング・システム、Just In Time (JIT)コンパイル・システム、ガベージ・コレクタなどのVM機能の一部をカプセル化します。

表 1-1では、すべてのプラットフォームMXBeanとそれぞれのプラットフォームMXBeanで管理するVMの状態を一覧で示します。各プラットフォームMXBeanには、プラットフォームMBeanサーバーの登録に必要な一意のjavax.management.ObjectNameがあります。Java VMでは、それぞれのMXBeanのインスタンスの数が、表に示すようにMXBeanの機能に応じて0、1、またはそれ以上となります。

表1-1 プラットフォームMXBean

インタフェース

管理下にあるVMの区分

オブジェクト名

VMごとのインスタンス数

ClassLoadingMXBean

クラス・ローディング・システム

java.lang:type= ClassLoading

1つ

CompilationMXBean

コンパイル・システム

java.lang:type= Compilation

ゼロまたは1つ

GarbageCollectorMXBean

ガベージ・コレクタ

java.lang:type= GarbageCollector、name=collectorName

1つ以上

LoggingMXBean

ロギング・システム

java.util.logging:type =Logging

1つ

MemoryManagerMXBean (GarbageCollectorMXBeanのサブインタフェース)

メモリー・プール

java.lang: typeMemoryManager, name=managerName

1つ以上

MemoryPoolMXBean

メモリー

java.lang:type= MemoryPool、name=poolName

1つ以上

MemoryMXBean

メモリー・システム

java.lang:type= Memory

1つ

OperatingSystemMXBean

基盤となるオペレーティング・システム

java.lang:type= OperatingSystem

1つ

RuntimeMXBean

ランタイム・システム

java.lang:type= Runtime

1つ

ThreadMXBean

スレッド・システム

java.lang:type= Threading

1つ

プラットフォームMXBean (LoggingMXBeanは除く)の詳細は、 java.lang.management APIリファレンスを参照してください。LoggingMXBeanインタフェースについては、java.util.logging APIリファレンスを参照してください。

プラットフォームMBeanサーバー

プラットフォームMBeanサーバーは、同一のJava VM内で実行する、個々に管理されたコンポーネントにより共有することができます。プラットフォームMBeanサーバーには、ManagementFactory.getPlatformMBeanServer()メソッドを使用してアクセスできます。このメソッドに対する1回目の呼出しにより、プラットフォームMBeanサーバーが作成され、このサーバーの一意のオブジェクト名を使用してプラットフォームMXBeanの登録が行われます。その後、このメソッドは、最初に作成したプラットフォームMBeanServerのインスタンスを返します。

動的に作成/破棄されたMXBean (たとえば、メモリー・プールやマネージャ)は、プラットフォームMBeanサーバーで自動的に登録や登録解除が行われます。システム・プロパティjavax.management.builder.initialの設定が行われている場合、プラットフォームMBeanサーバーは、指定のMBeanServerBuilderパラメータを使用して作成されます。

プラットフォームMBeanサーバーを使用してプラットフォームMXBeanの横にあるほかのMBeanの登録を行うことができます。これにより、MBeanはすべて同一のMBeanサーバーを介して公開され、ネットワークをより簡単に公開したり、検出することができるようになります。

2 JMXテクノロジを使用するモニタリングと管理

Java仮想マシン(Java VM)は組込みインストゥルメンテーションを備え、これによってJava Management Extensions (JMX)テクノロジを使用したモニターと管理を行うことができます。これらの組込み管理ユーティリティは通常、Java VMのアウトオブボックスの管理ツールと呼ばれます。適切に計測されたアプリケーションであれば、JMX APIを使用してモニターできます。

システム・プロパティの設定

すぐに使用できるJMXエージェントを有効にして、Java VMのモニターと管理ができるように構成するには、Java VMの起動時に特定のシステム・プロパティを設定する必要があります。システム・プロパティは、コマンド行で次のように設定します。

java -Dproperty=value ...

このようにシステム・プロパティはいくつでも設定できます。管理プロパティは、値を指定しないとデフォルト値に設定されます。すぐに使用できる管理プロパティの完全なセットについては、表2-1を参照してください。すぐに使用できるモニタリングと管理のプロパティのセクションで説明しているように、構成ファイルでシステム・プロパティを設定することもできます。

注意:
コマンド行からJava VMを実行するには、パスにJRE_HOME/binを追加する必要があります。JRE_HOMEはJava Runtime Environment (JRE)実装が入ったディレクトリです。または、コマンドを入力するときにフルパスを入力することもできます。

Java HotSpot VMでサポートされているコマンド行オプションの構文と完全なセットについては、Java Platform, Standard Editionツール・リファレンスのJavaアプリケーション・ランチャのセクションを参照してください。

すぐに使用できる管理の有効化

JMX APIを使用してJavaプラットフォームをモニターするには、次の手順を実行する必要があります。

1. Java VMの起動時にJMXエージェント(プラットフォームMBeanサーバーの別名)を有効にします。JMXエージェントの有効範囲は次のとおりです。

- ローカル・モニタリング、ローカル・システムで実行されるクライアント管理アプリケーション。

- リモート・モニタリング、リモート・システムで実行されるクライアント管理アプリケーション。

2. JMX仕様に準拠したツール(JConsoleなど)でJava VMをモニターします。JConsoleの使用を参照してください。

ローカル・モニタリングおよび管理

以前は、Java VMまたはJavaアプリケーションの起動時に、JMXクライアントがローカルJava VMにアクセスできるように次のプロパティを設定していました。

com.sun.management.jmxremote

このプロパティを設定すると、Java VMプラットフォームのMBeanが登録され、プライベート・インタフェースを介してRemote Method Invocation (RMI)コネクタが公開されました。この設定により、JMXクライアント・アプリケーションでローカルJavaプラットフォーム(つまり、JMXクライアントと同じマシンで実行されているJava VM)をモニターすることが可能になります。

現在のJava SEプラットフォームでは、このシステム・プロパティの設定は必要ありません。どのアプリケーションでも、現在のJava SEプラットフォームで起動したものであればAttach APIがサポートされ、ローカル・モニタリングと管理が必要な場合は自動的に使用可能になります。

たとえば、以前ならJava SEのサンプル・アプリケーションNotepadでJMXエージェントを有効にするには、次のコマンドを実行する必要がありました。

% cd JDK_HOME/demo/jfc/Notepad
% java -Dcom.sun.management.jmxremote -jar Notepad.jar

前述のコマンドのJDK_HOMEは、Java Development Kit (JDK)がインストールされるディレクトリです。現在のJava SEプラットフォームでは、次のコマンドを実行してNotepadを起動します。

% java -jar Notepad.jar

Notepadの起動後、Attach APIを使用するJMXクライアントでアウトオブボックスの管理エージェントを有効にして、Notepadアプリケーションのモニターと管理を行うことができます。

注意:
Windowsプラットフォームではセキュリティ上の理由から、ローカル・モニタリングと管理がサポートされるのは、デフォルトの一時ディレクトリが、ファイルおよびディレクトリのアクセス権が設定可能なファイル・システム(たとえば、New Technology File System (NTFS)ファイル・システム)にある場合にかぎられます。アクセス制御が不十分なFile Allocation Table (FAT)ファイル・システムではサポートされません。

JConsoleを使用したローカル・モニタリングおよび管理

JConsoleを使用したローカルのモニタリングは、開発とプロトタイプの作成に役立ちます。JConsoleのローカルな使用は、本番環境ではお薦めしません。JConsole自体が相当のシステム・リソースを消費するためです。JConsoleはリモート・システムで使用し、モニター対象のプラットフォームから分離した方がよいでしょう。

それでもローカルのモニタリングにJConsoleを使用する場合は、コマンド・シェルにjconsoleと入力してツールを起動します。引数なしでjconsoleを起動すると、ローカルのJavaアプリケーションがすべて自動検出され、モニター対象とするアプリケーションを選択できるダイアログ・ボックスが表示されます。JConsoleとアプリケーションはどちらも、同じユーザーが実行する必要があります。モニタリングおよび管理システムには、オペレーティング・システムのファイル・アクセス権を使用するためです。

注意:
コマンド行からJConsoleを実行するには、JDK_HOME/binをパスに追加する必要があります。または、コマンドを入力するときにフルパスを入力することもできます。JConsoleの使用を参照してください。

リモート・モニタリングおよび管理

デフォルトでは、ローカルで作成されたリモート・オブジェクトについて、クライアントに送信されるリモート・スタブにローカル・ホストのIPアドレスがdotted-quad形式で含まれます。リモート・スタブを特定のインタフェース・アドレスと関連付けるには、java.rmi.server.hostnameシステム・プロパティをそのインタフェースのIPアドレスに設定する必要があります。

リモート・システムからモニタリングと管理を行うには、Java VM起動時に次のシステム・プロパティを設定する必要があります。

com.sun.management.jmxremote.port=portNum

ここで、portNumはJMX RMI接続に使用するポート番号です。必ず未使用のポート番号を指定してください。ローカル・アクセス用にRMIコネクタが公開されるのに加えて、このプロパティを設定することにより、jmxrmiという名前を使用して、指定したポートの非公開の読取り専用レジストリに追加のRMIコネクタが公開されます。システム・プロパティを使用してRMIコネクタがバインドされるポート番号:

com.sun.management.jmxremote.rmi.port

必ず未使用のポート番号を使用してください。

注意:
セキュリティ用に設定するプロパティに加えて、前述のシステム・プロパティを設定する必要があります。

リモート・モニタリングと管理には、権限のない人がアプリケーションの制御やモニターができないように、セキュリティが必要です。デフォルトで、SSL (secure sockets layer)経由のパスワード認証とTLS (Transport Layer Security)が有効になっています。パスワード認証とSSLは別々に無効にすることができます。

注意:
実稼働システムの場合、クライアント・ホストを認証するSSLクライアント証明書とユーザー管理用のパスワード認証の両方を使用します。SSLの使用およびLDAP認証の使用を参照してください。

Javaプラットフォームでは、認証にプラガブルなログイン・モジュールがサポートされます。組織の認証インフラストラクチャに応じて、任意のログイン・モジュールをプラグインできます。LDAP認証の使用では、Lightweight Directory Access Protocol (LDAP)ベースの認証にcom.sun.security.auth.module.LdapLoginModuleモジュールをプラグインする方法について説明します。

JMXエージェントをリモートで使用可能にすると、「JConsoleによるリモート・モニタリング」に説明するように、JConsoleでアプリケーションをモニタリングできます。プログラムから管理エージェントに接続する方法については、「プログラムによるJMXエージェントへの接続」を参照してください。

パスワード認証の使用

このセクションでは、要件に応じて実装可能な異なるパスワード認証方式について説明します。

LDAP認証の使用

JMXエージェントでのJMXAuthenticatorの実装は、Java認証・承認サービス(JAAS)テクノロジに基づいています。認証は、ユーザー資格証明をJAASのjavax.security.auth.spi.LoginModuleオブジェクトに渡すことで実行されます。 com.sun.security.auth.module.LdapLoginModuleクラスは、LDAPを使用した認証を可能にします。デフォルトのLoginModuleクラスをLdapLoginModuleクラスで置き換えることができます。

必要なビジネス組織で機能するJAAS構成ファイルを作成します。構成ファイル(ldap.config)の例を次に示します。

ExampleCompanyConfig {
com.sun.security.auth.module.LdapLoginModule REQUIRED
userProvider="ldap://example-ds/ou=people,dc=examplecompany,dc=com"
userFilter="(&(uid={USERNAME})(objectClass=inetOrgPerson))"
authzIdentity=monitorRole;
};

構成ファイルに示されているオプションの概要を次に示します。

- com.sun.security.auth.module.LdapLoginModule REQUIREDオプションは、認証全体を正常に行うためにLdapLoginModuleを使用した認証が必要なことを意味します。

- userProviderオプションは、LDAPサーバー、およびユーザー・エントリがあるディレクトリ・ツリー内の位置を特定します。

- userFilterオプションは、LDAPディレクトリ内のユーザー・エントリの検索に使用する検索フィルタを指定します。フィルタを使用してディレクトリを検索する前に、トークン{USERNAME}はユーザー名と置き換えられます。

- authzIdentityオプションは、認証されたユーザーのアクセス・ロールを指定します。例では、認証されたユーザーはmonitorRoleを持ちます。アクセス・ファイルを参照してください。

コード例に示されている構成オプションの詳細は、com.sun.security.auth.module.LdapLoginModuleクラスを参照してください。

コマンド行で次のプロパティを設定して、アプリケーションを起動します。

- com.sun.management.jmxremote.login.config: このプロパティは、指定したJAAS構成エントリを使用するようJMXエージェントを構成します。

- java.security.auth.login.config: このプロパティは、JAAS構成ファイルへのパスを指定します。

コマンド行の例を次に示します。

java -Dcom.sun.management.jmxremote.port=5000
-Dcom.sun.management.jmxremote.login.config=ExampleCompanyConfig
-Djava.security.auth.login.config=ldap.config
-jar MyApplication.jar

ファイルベースのパスワード認証の使用

JMXエージェントによってサポートされるファイルベースのパスワード認証メカニズムは、パスワードをクリアテキストで格納し、開発での使用のみを目的としています。本番での使用の場合、認証にSSLクライアント証明書を使用するか、セキュアなログイン構成をプラグインすることをお薦めします。

注意:
警告: クライアントがセキュアではないRMIレジストリ(デフォルト)からリモート・コネクタを取得すると、リモート・コネクタからのパスワード認証でセキュリティの問題が発生する可能性があります。ターゲット・サーバー上で正当なRMIレジストリが起動する前に攻撃者が偽のRMIレジストリを起動すれば、クライアントのパスワードを盗むことができます。このシナリオは、システム・プロパティcom.sun.management.jmxremote.port=portNumでリモート管理を有効にしてJava VMを起動する場合も当てはまります。SSLが有効になっていても同じです。このような攻撃者は発見されることが多いものの、脆弱性があることは確かです。

デフォルトでは、リモート・モニタリングでJMXエージェントを有効にすると、JMXエージェントはパスワード認証を使用します。ただし、パスワードを設定する方法は、シングル・ユーザー環境かマルチユーザー環境かによって異なります。

パスワードはパスワード・ファイルにクリアテキストで格納されるため、通常のユーザー名とパスワードをモニタリング用に使用することはお薦めできません。代わりに、monitorRoleおよびcontrolRoleなどのパスワード・ファイルで指定したユーザー名を使用します。パスワードとアクセス・ファイルの使用を参照してください。

シングル・ユーザー環境を設定する方法

JRE_HOME/lib/managementディレクトリのパスワード・ファイルを、次のように設定します。

1. パスワード・テンプレート・ファイルjmxremote.password.templateをjmxremote.passwordにコピーします。

2. ファイル所有者だけがパスワード・ファイルを読書きできるように、ファイルのアクセス権を設定します。

3. monitorRoleやcontrolRoleなどのロールのパスワードを追加します。

マルチユーザー環境を設定する方法

JRE_HOME/lib/managementディレクトリのパスワード・ファイルを、次のように設定します。

1. パスワード・テンプレート・ファイルjmxremote.password.templateをホーム・ディレクトリにコピーし、そのファイル名をjmxremote.passwordに変更します。

2. 自分だけがパスワード・ファイルを読書きできるように、ファイルのアクセス権を設定します。

3. monitorRoleやcontrolRoleなどのロールのパスワードを追加します。

4. Java VMの起動時に、次のシステム・プロパティを設定します。

com.sun.management.jmxremote.password.file=pwFilePath

前述のプロパティのpwFilePathは、パスワード・ファイルへのパスです。

パスワード認証の無効化

リモート・モニタリングのパスワード認証は、デフォルトで有効になっています。パスワード認証を無効にするには、Java VMの起動時に次のシステム・プロパティを設定します。

com.sun.management.jmxremote.authenticate=false

注意:
警告: この構成はセキュアではありません。JMXポート番号およびホスト名を知っている(または推測する)リモート・ユーザーならだれでも、Javaアプリケーションおよびプラットフォームのモニターと制御ができます。開発用には許容される場合があっても、実稼動システムにはお薦めしません。

パスワード認証を無効にする場合、「セキュリティの無効化」で説明しているようにSSLを無効にすることもできます。SSLクライアント認証の有効化で説明しているように、パスワードを無効にしてSSLクライアント認証を使用することもできます。

SSLの使用

リモート・モニタリングおよび管理を有効にすると、SSLはデフォルトで有効になっています。SSLを使用するには、JMXエージェント(MBeanサーバー)が稼動するシステム上でデジタル証明書を設定して、次にSSLを正しく構成する必要があります。コマンド行ユーティリティkeytoolを使用して、証明書を操作します。

SSLを設定する一般的な手順は次のとおりです。

1. 鍵ペアと証明書がサーバーに設定されていない場合は、次のタスクを実行します。

- keytool -genkeyコマンドで鍵ペアを生成します。

- keytool -certreqコマンドで認証局(CA)に署名付き証明書を要求します。

- keytool -importコマンドで、証明書をキーストアにインポートします。keytoolのドキュメントで証明書のインポートを参照してください。

2. サーバー・システム上でSSLを構成します。このドキュメントでは、SSLの構成とカスタマイズについて詳細には説明しませんが、通常は次のリストに記載されているシステム・プロパティを設定する必要があります。

javax.net.ssl.keyStore

キーストアの場所

javax.net.ssl.keyStoreType

デフォルトのキーストア・タイプ

javax.net.ssl.keyStorePassword

デフォルトのキーストア・パスワード

javax.net.ssl.trustStore

トラストストアの場所

javax.net.ssl.trustStoreType

デフォルトのトラストストア・タイプ

javax.net.ssl.trustStorePassword

デフォルトのトラストストア・パスワード

システム・プロパティの設定については、システム・プロパティの設定のセクションを参照してください。

参照:

- Java Platform, Standard Editionツール・リファレンスのkeytool - 鍵と証明書の管理ツール

- Java Platform, Standard Editionセキュリティ開発者ガイドのデフォルトのキーストアとトラストストア、ストア・タイプ、およびストア・パスワードのカスタマイズ

RMIレジストリ認証の有効化

リモート・アプリケーションのモニタリングで接続を設定するとき、SSLで保護されているRMIレジストリにRMIコネクタ・スタブをオプションでバインドできます。これにより、適切なSSL証明書を持つクライアントは、RMIレジストリに登録されたコネクタ・スタブを取得できます。RMIレジストリをSSLで保護するには、次のシステム・プロパティを設定する必要があります。

com.sun.management.jmxremote.registry.ssl=true

このプロパティがtrueに設定されている場合、Java VMの起動時に、すぐに使用できる管理エージェントによって、SSLで保護されたRMIレジストリの生成および構成が行われます。このプロパティのデフォルト値はfalseです。ただし、このプロパティはtrueに設定することをお薦めします。このプロパティがtrueに設定されている場合、全面的なセキュリティを施すため、SSLクライアント認証を有効にする必要もあります。

SSLクライアント認証の有効化

SSLクライアント認証を有効にするには、Java VMの起動時に次のシステム・プロパティを設定します。

com.sun.management.jmxremote.ssl.need.client.auth=true

クライアントSSL認証を使用するには、SSLを有効(デフォルトはfalseに設定されます)にしておく必要があります。このプロパティはtrueに設定することをお薦めします。この構成では、クライアント・システムが有効なデジタル証明書を持つ必要があります。「SSLの使用」の説明に従って、クライアント・システムに証明書をインストールし、SSLを構成する必要があります。前のセクションで述べたように、RMIレジストリのSSL保護を有効にした場合は、クライアントSSL認証をtrueに設定する必要があります。

SSLの無効化

リモート・モニタリングでSSLを無効にするには、Java VMの起動時に次のシステム・プロパティを設定する必要があります。

com.sun.management.jmxremote.ssl=false

パスワード認証は、「パスワード認証の無効化」の手順に従って無効にしないかぎり、必要になります。

セキュリティの無効化

パスワード認証とSSLの両方を無効(つまりすべてのセキュリティを無効)にするには、Java VMの起動時に次のシステム・プロパティを設定する必要があります。

com.sun.management.jmxremote.authenticate=false
com.sun.management.jmxremote.ssl=false

注意:
警告: この構成はセキュアではありません。ポート番号およびホスト名を知っている(または推測する)リモート・ユーザーならだれでも、Javaアプリケーションおよびプラットフォームのモニターと制御ができます。さらに、危害の可能性はMBeanで定義する操作に限定されません。最低限のセキュリティ・マネージャもない場合、リモート・クライアントはjavax.management.loading.MLet MBeanを作成し、それを使用して任意のURLから新しいMBeanを作成できます。つまり、リモート・クライアントから、Javaアプリケーションに任意のコードを実行させることができるということです。

このような理由から、セキュリティの無効化は、開発時には許容される場合があっても、実稼動システムのセキュリティでは行わないことを強くお薦めします。

JConsoleによるリモート・モニタリング

セキュリティが有効でも無効でも、JConsoleを使用してアプリケーションをリモートでモニターできます。

JConsoleによるリモート・モニタリング(SSLが有効な場合)

SSLが有効な状態でリモート・アプリケーションをモニターするには、JConsoleが稼動しているシステムでtruststoreファイルを設定し、SSLを正しく構成する必要があります。たとえば、keystoreファイルを作成し、次のコマンドでアプリケーション(この例ではServer)を起動します。

% java -Djavax.net.ssl.keyStore=keystore \
-Djavax.net.ssl.keyStorePassword=password Server

Java Platform, Standard Editionセキュリティ開発者ガイドのデフォルトのキーストアとトラストストア、ストア・タイプ、およびストア・パスワードのカスタマイズを参照してください。

keystoreファイルを作成してServerアプリケーションを起動する場合、次のようにJConsoleを起動します。

% jconsole -J-Djavax.net.ssl.trustStore=truststore \
-J-Djavax.net.ssl.trustStorePassword=trustword

JConsoleの使用を参照してください。

この構成により認証されるのは、サーバーのみです。クライアントSSL認証が設定されている場合、同様のkeystoreファイルをJConsoleのキーに渡し、該当するtruststoreファイルをアプリケーションに渡す必要があります。

パスワードとアクセス・ファイルの使用

パスワードおよびアクセス・ファイルは、リモート・モニタリングおよび管理のセキュリティを制御します。これらのファイルは、デフォルトではJRE_HOME/lib/managementにあり、標準のJavaプロパティ・ファイル・フォーマットです。フォーマットに関する詳細は、java.util.Propertiesパッケージの「APIリファレンス」を参照してください。

パスワード・ファイル

パスワード・ファイルは、各種ロールとそのパスワードを定義します。アクセス制御ファイル(デフォルトでは、jmxremote.access)は、ロールごとに許可するアクセス権を定義します。ロールを機能させるには、パスワードとアクセス・ファイルの両方にエントリを持つ必要があります。

JRE実装には、jmxremote.password.templateというパスワード・ファイル・テンプレートがあります。このファイルをホーム・ディレクトリのjre_home/lib/management/jmxremote.passwordにコピーして、アクセス・ファイルで定義したロールのパスワードを追加します。

パスワード・ファイルにはパスワードがクリアテキストで含まれるため、必ず所有者だけがこのファイルへの読取りおよび書込みアクセス権を持つようにしてください。セキュリティ上の理由から、システムは所有者だけがファイルを読取り可能であるか確認し、そうでない場合はエラーとして終了します。このため、マルチユーザー環境では、パスワード・ファイルをホーム・ディレクトリなどの非公開の場所に保存する必要があります。

プロパティ名はロールで、関連付けられた値はロールのパスワードです。例2–1に、パスワード・ファイルのエントリの例を示します。

例 2-1パスワード・ファイルの例

# specify actual password instead of the text password
monitorRole password
controlRole password

Solaris、LinuxまたはmacOSオペレーティング・システムで、パスワード・ファイルのファイル・アクセス権を設定するには、次のコマンドを実行します。

chmod 600 jmxremote.password

アクセス・ファイル

デフォルトでは、アクセス・ファイルはjmxremote.accessという名前です。プロパティ名はパスワード・ファイルと同じ領域のIDです。関連する値はreadonlyまたはreadwriteのいずれかにする必要があります。

アクセス・ファイルはロールとそのアクセス・レベルを定義します。デフォルトでは、アクセス・ファイルは次の主要なロールを定義します。

- monitorRole: モニタリングのための読取り専用アクセスを許可します。

- controlRole: モニタリングおよび管理のために読取り/書込みアクセスを許可します。

アクセス制御エントリは、ロール名と関連するアクセス・レベルで構成されています。ロール名には、スペースやタブを含めることはできず、パスワード・ファイル内のエントリに対応している必要があります。アクセス・レベルは次のいずれかです。

- readonly: MBeanの属性の読取りアクセスを許可します。これは、モニタリングの場合、このロールのリモート・クライアントから測定値を読み取ることはできるが、実行中のプログラムの環境を変更するアクションは実行できないという意味です。リモート・クライアントはMBeanの通知を待機することもできます。

- readwrite: MBeanの属性の読取りおよび書込み、MBeanの属性への操作の呼び出し、MBeanの属性の作成または削除のためのアクセスを許可します。アプリケーションの操作を妨げる可能性があるため、このアクセス権は信頼できるクライアントのみに許可する必要があります。

ロールは、アクセス・ファイル内で1つのエントリだけを持つ必要があります。ロールにエントリがない場合、アクセス権はありません。ロールに複数のエントリがある場合、最後のエントリが優先されます。アクセス・ファイルの事前定義された一般的なロールには、例2-2に示すようなものがあります。

例 2-2アクセス・ファイルの例

# The "monitorRole" role has readonly access.
# The "controlRole" role has readwrite access.
monitorRole readonly
controlRole readwrite

JConsoleによるリモート・モニタリング(SSLが無効な場合)

SSLが無効な状態でリモート・アプリケーションをモニターするには、次のコマンドでJConsoleを起動します。

% jconsole hostName:portNum

ホスト名とポート番号を省略して、JConsoleが提供するダイアログ・ボックスに入力することもできます。

すぐに使用できるモニタリングと管理のプロパティ

すぐに使用できるモニタリングおよび管理のプロパティは、構成ファイルまたはコマンド行で設定できます。コマンド行で指定したプロパティにより、構成ファイル内のプロパティをオーバーライドします。構成ファイルのデフォルトの場所は、jre_home/lib/management/management.propertiesです。次のいずれかのコマンド行プロパティが設定されている場合、Java VMはこのファイルを読み取ります。

- com.sun.management.jmxremote または

- com.sun.management.jmxremote.port

SNMP (Simple Network Management Protocol)による管理では、同じ構成ファイルを使用します。SNMPモニタリングと管理を参照してください。

次のコマンド行オプションで、構成ファイルに別の場所を指定できます。

com.sun.management.config.file=ConfigFilePath

ConfigFilePathは、構成ファイルへのパスです。

表2-1に、すぐに使用できるモニタリングおよび管理のプロパティを示します。

表2-1 すぐに使用できるモニタリングおよび管理のプロパティ

プロパティ

説明

値

com.sun.management.jmxremote

JMXコネクタを使用して、JMXリモート・エージェントおよびローカル・モニタリングを有効にします。このエージェントは、JConsoleおよび(Attach APIを使用する)その他のローカルJMXクライアントによって使用されるプライベート・インタフェースで公開されます。JConsoleがこのコネクタを使用できるのは、エージェントを起動したユーザーがそのコネクタも起動した場合です。このコネクタからの要求については、パスワードまたはアクセス・ファイルはチェックされません。

true / false.デフォルトはtrueです。

com.sun.management.jmxremote.port

JMXリモート・エージェントを有効にして、リモートJMXコネクタを作成し、指定したポートで待機します。デフォルトでは、SSL、パスワード、およびアクセス・ファイル・プロパティがこのコネクタに使用されます。また、com.sun.management.jmxremoteプロパティで説明したローカル・モニタリングも有効にします。

ポート番号。デフォルトなし。

com.sun.management.jmxremote.registry.ssl

RMIコネクタ・スタブを、SSLで保護されたRMIレジストリにバインドします。

true / false.デフォルトはfalseです。

com.sun.management.jmxremote.ssl

SSLを使用してセキュアなモニタリングを可能にします。値がfalseの場合、SSLは使用されません。

true / false.デフォルトはtrueです。

com.sun.management.jmxremote.ssl.enabled.protocols

有効にするSSL/TLSプロトコル・バージョンのカンマ区切りのリストを表示します。com.sun.management.jmxremote.sslと組み合わせて使用します。

デフォルトのSSL/TLSプロトコル・バージョン。

com.sun.management.jmxremote.ssl.enabled.cipher.suites

有効にするSSL/TLS暗号化方式のカンマ区切りのリストを表示します。com.sun.management.jmxremote.sslと組み合わせて使用します。

デフォルトのSSL/TLS暗号化方式。

com.sun.management.jmxremote.ssl.need.client.auth

このプロパティがtrueで、com.sun.management.jmxremote.sslプロパティもtrueの場合、クライアント認証が実行されます。

このプロパティはtrueに設定することをお薦めします。

true / false.デフォルトはfalseです。

com.sun.management.jmxremote.authenticate

このプロパティがfalseの場合、JMXでパスワードまたはアクセス・ファイルを使用できなくなります。すべてのユーザーに完全なアクセスが提供されます。

true / false.デフォルトはtrueです。

com.sun.management.jmxremote. password.file

パスワード・ファイルの場所を指定します。com.sun.management.jmxremote.authenticateがfalseの場合、このプロパティならびにパスワードおよびアクセス・ファイルは無視されます。それ以外の場合は、パスワード・ファイルが存在し、有効な形式である必要があります。パスワード・ファイルが空であるか存在しない場合、アクセスは許可されません。

JRE_HOME/lib/management/ jmxremote.password

com.sun.management.jmxremote.access.file

アクセス・ファイルの場所を指定します。com.sun.management.jmxremote.authenticateがfalseの場合、このプロパティ(ならびにパスワードおよびアクセス・ファイル)は無視されます。それ以外の場合は、アクセス・ファイルが存在し、有効な形式である必要があります。アクセス・ファイルが空であるか存在しない場合、アクセスは許可されません。

JRE_HOME/lib/management/jmxremote.access

com.sun.management.jmxremote.login.config

JMXエージェントがユーザーを認証する場合に使用するJAAS (Java認証・承認サービス)ログイン構成エントリの名前を指定します。このプロパティを使用してデフォルトのログイン構成をオーバーライドする場合は、指定された構成エントリがJAASでロードされたファイルに存在する必要があります。また、構成で指定されたログイン・モジュールは、名前とパスワードのコールバックを使用してユーザーの資格証明を取得する必要があります。詳細は、javax.security.auth.callback.NameCallbackおよびjavax.security.auth.callback.PasswordCallbackのAPIドキュメントを参照してください。

デフォルトのログイン構成は、ファイルベースのパスワード認証です。

構成エラー

MBeanサーバー、RMIレジストリ、またはコネクタの起動中にエラーが発生した場合、Java VMは例外をスローして終了します。構成エラーには、次のようなものがあります。

- ポート番号に対するバインドの失敗

- 無効なパスワード・ファイル

- 無効なアクセス・ファイル

- パスワード・ファイルが所有者以外のユーザーから読取り可能になっている

アプリケーションでセキュリティ・マネージャを実行する場合、セキュリティ・アクセス権ファイルに追加のアクセス権を登録する必要があります。

プログラムによるJMXエージェントへの接続

JMXエージェントを有効にしたら、クライアントから次のURLを使用してモニタリング・サービスにアクセスできます。

service:jmx:rmi:///jndi/rmi://hostName:portNum/jmxrmi

クライアントがエージェントのコネクタを作成するには、例2-3のように、URLを使用してjavax.management.remote.JMXServiceURLオブジェクトをインスタンス化した後、JMXConnectorFactory.connectメソッドを使用して接続を作成します。

例 2-3 JMXConnectorFactory.connectを使用した接続の作成

JMXServiceURL u = new JMXServiceURL(
"service:jmx:rmi:///jndi/rmi://" + hostName + ":" + portNum +  "/jmxrmi");
JMXConnector c = JMXConnectorFactory.connect(u);

プログラムによるモニタリングおよび管理の設定

Attach APIを使用するJMXクライアントを作成することで、Java SE 9プラットフォームで起動する任意のアプリケーションに対して、すぐに使用できるモニタリングおよび管理を有効化できます。アプリケーションの起動時にモニター対象として構成する必要はありません。Attach APIは、ツールによってターゲット・アプリケーションのエージェントに接続し、それらのエージェントを起動します。エージェントが起動すれば、JMXクライアント(やその他のツール)は、そのエージェントにかわってJava VMが保持するプロパティ・リストを使用して、そのエージェントのJMXコネクタ・アドレスを取得できます。このリストに含まれるプロパティは、Attach APIを使用するツールからアクセスできます。したがって、アプリケーションから起動したエージェントが構成情報を示すプロパティを生成した場合、その構成情報はアプリケーションに接続するツールから利用できます。

JMXエージェントは、ローカルのJMXコネクタ・サーバーのアドレスからプロパティを生成します。これによって、JMXツールは、起動中のエージェントのコネクタ・アドレスを取得し、これに接続できます。

例 2-4に示すコードをJMXツールで使用すれば、ターゲットVMに接続し、JMXエージェントのコネクタ・アドレスを取得し、これに接続することができます。

例2-4 コネクタへのJMXツールの接続とエージェントのアドレスの取得

static final String CONNECTOR_ADDRESS =
"com.sun.management.jmxremote.localConnectorAddress";

// attach to the target application
VirtualMachine vm = VirtualMachine.attach(id);

// get the connector address
String connectorAddress =
vm.getAgentProperties().getProperty(CONNECTOR_ADDRESS);

// no connector address, so we start the JMX agent
if (connectorAddress == null) {
String agent = vm.getSystemProperties().getProperty("java.home") +
File.separator + "lib" + File.separator + "management-agent.jar";
vm.loadAgent(agent);

// agent is started, get the connector address
connectorAddress =
vm.getAgentProperties().getProperty(CONNECTOR_ADDRESS);
}

// establish connection to connector server
JMXServiceURL url = new JMXServiceURL(connectorAddress);
JMXConnector = JMXConnectorFactory.connect(url);

例 2-4は、com.sun.tools.attach.VirtualMachineクラスのattach()メソッドを使用して、指定されたJava VMに接続することにより、ターゲットJava VMが稼動中のエージェントに代わって保持するプロパティを、指定されたJava VMで読み取ることができるようになっています。エージェントがすでに実行中の場合は、VirtualMachineクラスのgetAgentProperties()メソッドを呼び出し、そのエージェントのアドレスを取得します。ローカル・コネクタ・アドレスcom.sun.management.jmxremote.localConnectorAddressについて、getAgentProperties()メソッドは文字列プロパティを返します。これを使用すれば、ローカルのJMXエージェントに接続できます。

実行中のエージェントがない場合、jre_home/lib/management-agent.jarからいずれかのエージェントがVirtualMachineクラスによってロードされます。そのコネクタ・アドレスはgetAgentProperties()によって取得されます。

次に、エージェントへの接続を確立するには、このコネクタ・アドレスから構築されたJMXサービスURLのJMXConnectorFactory.connectを呼び出します。

JMXリモートAPIによるすぐに使用できる管理の模倣

すぐに使用できる管理エージェントへのリモート・アクセスは、認証・承認に加え、SSL暗号化によって保護されています。構成を実行するには、システム・プロパティを設定するか、management.propertiesファイルを定義します。ほとんどの場合、すぐに使用できる管理エージェントを使用し、これをmanagement.propertiesファイルで構成すれば、リモートJava VMをセキュアに管理するのに十分です。ただし、さらに高いレベルのセキュリティが必要な場合もあれば、システム構成によってはmanagement.propertiesファイルを使用できない場合もあります。このような場合には、ファイアウォールを通過できるようにRMIサーバーのリモート・オブジェクトを特定のポートにエクスポートすることや、マルチホーム・システムで特定のネットワーク・インタフェースを使用してRMIサーバーのリモート・オブジェクトをエクスポートすることが必要になる場合もあります。このような場合、JMXリモートAPIを使用して直接プログラムから管理エージェントの作成、構成、配備を行うことで、すぐに使用できる管理エージェントの動作を模倣できます。

すぐに使用できる管理の模倣の例

このセクションでは、すぐに使用できる管理エージェントをまったく同じものとして模倣するJMXエージェントの実装方法を例示します。すぐに使用できる管理エージェントとまったく同様に、例2-5で作成するエージェントはポート3000で実行されます。このエージェントは、password.propertiesというパスワード・ファイルとaccess.propertiesというアクセス・ファイルを持ち、SSL/TLSベースのRMIソケット・ファクトリのデフォルトの構成を実装し、サーバー認証のみを必要とします。この例は、「SSLの使用」で説明しているように、keystoreがすでに作成されていることが前提です。SSL構成の設定方法の詳細は、Java Platform, Standard Editionセキュリティ開発者ガイドのJSSEで使用するキーストアの作成のセクションを参照してください。

すぐに使用できるJMXエージェントを構成で使用してcom.example.MyAppというアプリケーションのモニタリングと管理を有効にするには、次のコマンドでcom.example.MyAppを実行します。

% java -Dcom.sun.management.jmxremote.port=3000 \
-Dcom.sun.management.jmxremote.password.file=password.properties \
-Dcom.sun.management.jmxremote.access.file=access.properties \
-Djavax.net.ssl.keyStore=keystore \
-Djavax.net.ssl.keyStorePassword=password \
com.example.MyApp

注意:
com.sun.management.jmxremote.*プロパティは、コマンド行で渡すかわりに、management.propertiesファイルで指定することもできます。その場合は、システム・プロパティ-Dcom.sun.management.config.file=management.propertiesで、management.propertiesファイルの場所を指定する必要があります。

例2-5は、com.example.MyAppで前述のコマンドを使用した場合とまったく同じモニタリングおよび管理ができるJMXエージェントをプログラムによって作成する場合に、記述が必要なコードを示しています。

例2-5 プログラムによるすぐに使用できるJMXエージェントの模倣

package com.example;

import java.lang.management.*;
import java.rmi.registry.*;
import java.util.*;
import javax.management.*;
import javax.management.remote.*;
import javax.management.remote.rmi.*;
import javax.rmi.ssl.*;

public class MyApp {

public static void main(String[] args) throws Exception {

// Ensure cryptographically strong random number generator used
// to choose the object number - see java.rmi.server.ObjID
//
System.setProperty("java.rmi.server.randomIDs", "true");

// Start an RMI registry on port 3000.
//
System.out.println("Create RMI registry on port 3000");
LocateRegistry.createRegistry(3000);

// Retrieve the PlatformMBeanServer.
//
System.out.println("Get the platform's MBean server");
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();

// Environment map.
//
System.out.println("Initialize the environment map");
HashMap<String,Object> env = new HashMap<String,Object>();

// Provide SSL-based RMI socket factories.
//
// The protocol and cipher suites to be enabled will be the ones
// defined by the default JSSE implementation and only server
// authentication will be required.
//
SslRMIClientSocketFactory csf = new SslRMIClientSocketFactory();
SslRMIServerSocketFactory ssf = new SslRMIServerSocketFactory();
env.put(RMIConnectorServer.RMI_CLIENT_SOCKET_FACTORY_ATTRIBUTE, csf);
env.put(RMIConnectorServer.RMI_SERVER_SOCKET_FACTORY_ATTRIBUTE, ssf);

// Provide the password file used by the connector server to
// perform user authentication. The password file is a properties
// based text file specifying username/password pairs.
//
env.put("jmx.remote.x.password.file", "password.properties");

// Provide the access level file used by the connector server to
// perform user authorization. The access level file is a properties
// based text file specifying username/access level pairs where
// access level is either "readonly" or "readwrite" access to the
// MBeanServer operations.
//
env.put("jmx.remote.x.access.file", "access.properties");

// Create an RMI connector server.
//
// As specified in the JMXServiceURL the RMIServer stub will be
// registered in the RMI registry running in the local host on
// port 3000 with the name "jmxrmi". This is the same name that the
// ready-to-use management agent uses to register the RMIServer
// stub.
//
System.out.println("Create an RMI connector server");
JMXServiceURL url =
new JMXServiceURL("service:jmx:rmi:///jndi/rmi://:3000/jmxrmi");
JMXConnectorServer cs =
JMXConnectorServerFactory.newJMXConnectorServer(url, env, mbs);

// Start the RMI connector server.
//
System.out.println("Start the RMI connector server");
cs.start();
}
}

次のコマンドでこのアプリケーションを起動します。

java -Djavax.net.ssl.keyStore=keystore \
-Djavax.net.ssl.keyStorePassword=password \
com.example.MyApp

com.example.MyAppアプリケーションにより、JMXエージェントが有効になり、Javaプラットフォームのすぐに使用できる管理エージェントを使用した場合とまったく同様にモニタリングと管理が行われます。ただし、すぐに使用できる管理エージェントで使用するRMIレジストリとそれを模倣した管理エージェントで使用するRMIレジストリとでは、わずかながら重要な違いが1つあります。すぐに使用できる管理エージェントで使用するRMIレジストリは読取り専用です。つまり、これにバインドできるのは単一のエントリであり、一度バインドされたエントリはアンバインドできません。これは例2-5で作成されたRMIレジストリには当てはまりません。

そのほか、どちらのRMIレジストリも、SSL/TLSを使用しないため、セキュアではありません。RMIレジストリは、クライアント認証を必要とするSSL/TLSベースのRMIソケット・ファクトリを使用して作成する必要があります。そうすれば、クライアントの資格証明が悪意のあるRMIサーバーに送信されることはなく、RMIレジストリが信頼できないクライアントにRMIサーバー・スタブへのアクセスを許すこともありません。

SSL/TLS RMIソケット・ファクトリを実装するRMIレジストリは、management.propertiesファイルに次のプロパティを追加することで作成できます。

com.sun.management.jmxremote.registry.ssl=true
com.sun.management.jmxremote.ssl.need.client.auth=true

例2-5では、すぐに使用できるJMXエージェントの主な動作を模倣していますが、management.propertiesファイルにある既存のプロパティのすべてを複製しているわけではありません。ただし、com.example.MyAppを適切に変更すれば、別のプロパティを追加できます。

ファイアウォールを介したアプリケーションのモニタリング

例2-5のコードを使用すればファイアウォールを介してアプリケーションのモニターができますが、すぐに使用できるモニタリング・ソリューションではこれができない場合もあります。com.sun.management.jmxremote.port管理プロパティによりRMI Registryが接続可能なポートが指定されますが、RMIServerおよびRMIConnectionリモート・オブジェクトがエクスポートされるポートは、RMIスタックにより選択されます。リモート・オブジェクト(RMIServerとRMIConnection)を指定されたポートにエクスポートするには、例2-5のように、プログラムによってRMIコネクタ・サーバーを作成する必要があります。ただし、JMXServiceURLは次のように指定する必要があります。

JMXServiceURL url = new JMXServiceURL("service:jmx:rmi://localhost:" +
port1  + "/jndi/rmi://localhost:" + port2 + "/jmxrmi");

port1はRMIServerおよびRMIConnectionリモート・オブジェクトがエクスポートされるポート番号、port2はRMIレジストリのポート番号です。

エージェント・クラスを使用するアプリケーションの計測

Java SEプラットフォームは、Javaプログラミング言語エージェントによりJava VMで実行中のプログラムを計測するサービスを提供します。インストゥルメンテーション・エージェントを作成すれば、アプリケーションをモニターする場合、そのアプリケーションに新しいコードを追加する必要がなくなります。モニタリングと管理は、アプリケーションのstatic mainメソッドに実装するのではなく、別のエージェント・クラスに実装し、-javaagentオプションを指定することでアプリケーションを起動します。エージェント・クラスを作成してアプリケーションを計測する方法の詳細は、java.lang.instrumentパッケージのAPIリファレンス・ドキュメントを参照してください。

アプリケーションを計測するエージェント・クラスの作成

次の手順は、com.example.MyAppのコードを改変して、エージェントにモニタリングおよび管理用の他のアプリケーションを計測させる方法を示しています。

1. com.example.MyAgentクラスを作成します。
com.example.MyAgentというクラスを作成し、mainメソッドではなくpremainメソッドを宣言します。

package com.example;

[...]

public class MyAgent {

public static void premain(String args) throws Exception {

[...]

com.example.MyAgentクラスの残りのコードは、例2-5に示したcom.example.MyAppクラスとまったく同じです。

2. com.example.MyAgentクラスをコンパイルします。

3. Premain-Classエントリを使用して、マニフェスト・ファイルMANIFEST.MFを作成します。
エージェントはJavaアーカイブ(JAR)ファイルとして配備されます。JARファイルに含まれるマニフェストの属性は、エージェントを起動するためにロードされるエージェント・クラスを指定します。MANIFEST.MFというファイルを作成し、次の行を挿入します。

Premain-Class: com.example.MyAgent

4. JARファイルMyAgent.jarを作成します。
JARファイルには必ず次のファイルを入れます。

- META-INF/MANIFEST.MF

- com/example/MyAgent.class

5. アプリケーションを起動し、モニタリングおよび管理サービスを提供するエージェントを指定します。
com.example.MyAgentを使用すれば、モニタリングおよび管理用のアプリケーションを計測できます。次の例では、アプリケーションとしてNotepadを使用します。

% java -javaagent:MyAgent.jar -Djavax.net.ssl.keyStore=keystore \
-Djavax.net.ssl.keyStorePassword=password -jar Notepad.jar

Notepadを起動するとき、-javaagentオプションを使用して、com.example.MyAgentエージェントを指定します。また、com.example.MyAgentアプリケーションが例2-5のcom.example.MyAppアプリケーションと同じコードを複製する場合、RMIコネクタ・サーバーはSSLで保護されているため、keystoreとpasswordの情報を指定します。

3 JConsoleの使用

JConsoleグラフィカル・ユーザー・インタフェースは、Java Management Extensions (JMX)仕様に準拠したモニタリング・ツールです。JConsoleはJava仮想マシン(Java VM)の広範なインストゥルメンテーションを使用して、Javaプラットフォームで実行されるアプリケーションのパフォーマンスとリソース消費に関する情報を提供します。

JConsoleが更新され、WindowsおよびGNOMEデスクトップのルック・アンド・フィールが提供されるようになりました(その他のプラットフォームでは標準的なJavaのグラフィカル・ルック・アンド・フィールが提供されます)。このドキュメントに掲載した画面キャプチャは、Windows XPで動作するインタフェースのインスタンスから取得されました。

JConsoleの起動

jconsole実行可能ファイルは、JDK_HOME/binにあります。ここでJDK_HOMEは、Java Development Kit (JDK)がインストールされているディレクトリです。このディレクトリがシステム・パスにある場合は、コマンド(シェル)プロンプトでjconsoleと入力するだけで、JConsoleを起動できます。それ以外の場合は、実行可能ファイルへのフル・パスを入力する必要があります。

コマンド構文

JConsoleを使用すれば、ローカル・アプリケーション(JConsoleと同じシステム上で動作するアプリケーション)とリモート・アプリケーション(ほかのシステム上で動作するアプリケーション)の両方をモニターできます。

注意:
JConsoleを使用してローカル・アプリケーションをモニターするのは、開発やプロトタイプ作成には便利ですが、JConsole自体がかなりのシステム・リソースを消費するため、実稼動環境で使用することはお薦めしません。JConsoleアプリケーションをモニタリング対象のプラットフォームから切り離すために、リモート・モニタリングをお薦めします。

完全な構文については、Java Platform, Standard Editionツール・リファレンスのjconsoleを参照してください。

ローカル・モニタリングの設定

次のコマンドを使用してJConsoleを起動します。

% jconsole

JConsoleが起動したら、JConsoleが接続可能なロカールで実行しているJavaアプリケーションのうち、必要なものを選択します。

特定のアプリケーションをモニターする場合、そのアプリケーションのプロセスIDがわかっていれば、JConsoleを起動して、そのアプリケーションに接続できます。この場合、アプリケーションはJConsoleと同じユーザーIDで実行する必要があります。次のコマンド構文を使用して、特定アプリケーションのローカル・モニタリングのためにJConsoleを起動します。

% jconsole processID

processIDは、アプリケーションのプロセスID (PID)です。アプリケーションのPIDを調べるには、次の手順を実行します。

- Solaris、LinuxまたはmacOSシステムの場合、psコマンドを使用して、実行中のjavaインスタンスのPIDを見つけることができます。

- Windowsシステムの場合、タスク・マネージャを使用して、javaまたはjavawのPIDを見つけます。

- jpsコマンド行ユーティリティを使用してPIDを調べることもできます。Java Platform, Standard Editionツール・リファレンスのjpsを参照してください。

たとえば、NotepadアプリケーションのプロセスIDが2956である場合は、次のコマンドでJConsoleを起動します。

% jconsole 2956

JConsoleとアプリケーションは同じユーザーが実行する必要があります。管理およびモニタリング・システムは、オペレーティング・システムのファイル・アクセス権を使用します。プロセスIDを指定しない場合、JConsoleによってローカルのJavaアプリケーションがすべて自動的に検出され、モニターするアプリケーションを選択するためのダイアログ・ボックスが表示されます(「JMXエージェントへの接続」を参照)。

ローカル・モニタリングおよび管理を参照してください。

リモート・モニタリングの設定

リモート・モニタリングのためにJConsoleを起動するには、次のコマンド構文を使用します。

% jconsole hostName:portNum

hostNameはアプリケーションを実行するシステムの名前、portNumは、Java VMを起動してJMXエージェントを有効にしたときに指定したポート番号です。リモート・モニタリングおよび管理を参照してください。

ホスト名/ポート番号の組み合わせを指定しない場合、JConsoleには、ホスト名とポート番号が入力可能な接続ダイアログ・ボックス(JMXエージェントへの接続)が表示されます。

セキュアなリモート・モニタリングの設定

Secure Sockets Layer (SSL)でセキュリティ保護された接続によりモニタリングを実行するよう、JConsoleを起動することもできます。セキュアな接続を使用してJConsoleを起動するコマンドは、JConsoleによるリモート・モニタリング(SSLが有効な場合)を参照してください。

JMXエージェントへの接続

接続先のJMXエージェントを指定する引数を使用してJConsoleを起動した場合、指定したJava VMのモニタリングが自動的に開始されます。「接続」と「新規接続」|を選択し、必要な情報を入力することで、いつでも別のホストに接続できます。

JConsoleを起動するときに引数を指定しない場合、最初に接続ダイアログ・ボックスが表示されます。このダイアログ・ボックスで、「ローカル」と「リモート」のどちらのプロセスに接続するかを選択します。

JConsoleのローカル・プロセスへの接続

接続するJMXエージェントを設定せずにJConsoleを起動すると、次のダイアログ・ボックスが表示されます。

図 3-1ローカル・プロセスへの接続の作成

ローカル・プロセス・オプションには、JConsoleと同じユーザーIDで起動され、ローカル・システム上で実行中のJava VMが、そのプロセスIDとクラス、または引数の情報とともに一覧表示されます。JConsoleをアプリケーションに接続するには、モニターするアプリケーションを選択して「接続」をクリックします。ローカル・プロセスのリストには、次のタイプのJava VMで実行中のアプリケーションが含まれます。

- 管理エージェントが有効なアプリケーション: Java SEプラットフォーム上のアプリケーションのうち、-Dcom.sun.management.jmxremoteオプションを使用して起動したもの、または-Dcom.sun.management.jmxremote.portオプションを指定して起動したものが含まれます。また、Java SEプラットフォーム上で管理プロパティなしで起動したアプリケーションのうち、あとからJConsoleによって接続が行われ、実行時に管理エージェントを有効になったものも含まれます。

- 接続可能で、管理エージェントが無効なアプリケーション: 実行時に管理エージェントのロードをサポートしている、接続可能なアプリケーションが含まれます。接続可能なアプリケーションには、Attach APIをサポートする、Java SEプラットフォーム上で起動したアプリケーションが含まれます。動的接続をサポートするアプリケーションについては、コマンド行でcom.sun.management.jmxremoteまたはcom.sun.management.jmxremote.portオプションを指定して管理エージェントを起動する必要ありません。JConsoleは、アプリケーションの起動前に管理エージェントに接続する必要はありません。このアプリケーションを選択すると、接続確立時に管理エージェントが有効になるという通知が画面上に表示されます。図3-1の接続ダイアログ・ボックスの例では、NetBeans IDEとJConsoleはJava SEプラットフォームVM内で起動しています。両方とも標準テキストで表示され、JConsoleが接続可能であることを示しています。図3-1では、JConsoleが選択され、通知が表示されています。

- 接続不可能で、管理エージェントが無効なアプリケーション: Java SEプラットフォームで、-Dcom.sun.management.jmxremoteまたはcom.sun.management.jmxremote.portオプションなしで起動したアプリケーションが含まれます。これらのアプリケーションは、表にグレー表示され、JConsoleは接続できません。図3-1の接続ダイアログ・ボックスの例では、Anagramsアプリケーションは、管理プロパティでJMXエージェントを有効にせずにJava SEプラットフォームVMで起動されたため、グレー表示され選択不可になっています。

図3-2 管理エージェントを有効にせずに試行するアプリケーションへの接続

図3-2の接続ダイアログ・ボックスの例では、Anagramsアプリケーションが選択されていますが、「接続」はグレー表示のままで、このプロセスでは管理エージェントが有効でないという通知が表示されています。JConsoleは、起動時に正しいJava VMまたは正しいオプションを使用しなかったため、Anagramsに接続できません。

JConsoleのリモート・プロセスへの接続

接続ダイアログ・ボックスが開くと、リモート・プロセスへの接続オプションも表示されます。

図 3-3リモート・プロセスへの接続の作成

リモートJava VM上で実行中のプロセスをモニターするには、次の情報を入力する必要があります。

- ホスト名: Java VMが動作しているマシンの名前。

- ポート番号: Java VMの起動時に指定したJMXエージェントのポート番号。

- ユーザー名とパスワード: ユーザー名と使用するパスワード(パスワード認証の必要なJMXエージェントでJava VMをモニタリングする場合のみ必要)。

JMXエージェントのポート番号を設定するには、すぐに使用できる管理の有効化.を参照してください。

パスワードとアクセス・ファイルの使用を参照してください。

JConsoleを実行しているJava VMをモニターするには、「接続」をクリックし、ホストをlocalhost、ポートを0と指定します。

JMXサービスURLを使用する接続

リモート・プロセス・オプションを使用してほかのJMXエージェントに接続するには、そのエージェントのJMXサービスURL、ユーザー名、およびパスワードを指定します。JMXサービスURLの構文には、接続に使用するトランスポート・プロトコルとサービス・アクセス・ポイントを指定する必要があります。JMXサービスURLの全構文は、javax.management.remote.JMXServiceURLのAPIドキュメントに記載されています。

図 3-4 JMXサービスURLによるJMXエージェントへの接続

JMXエージェントがJavaプラットフォームに含まれていないコネクタを使用する場合は、jconsoleコマンドを実行するときに、次のようにコネクタ・クラスをクラス・パスに追加する必要があります。

% jconsole -J-Djava.class.path=JAVA_HOME/lib/jconsole.jar:JAVA_HOME/lib/tools.jar:connector-path

connector-pathは、JDKには含まれていないがJConsoleで使用するコネクタ・クラスがあるディレクトリまたはJavaアーカイブ(JAR)ファイルです。

JConsoleタブの表示

JConsoleをアプリケーションに接続すると、次の6つのタブがJConsoleに表示されます。

- 概要: Java VMとモニター結果の値の概要を表示します

- メモリー: メモリーの使用情報を表示します

- スレッド: スレッドの使用情報を表示します

- クラス: クラス・ローディングの情報を表示します

- VM: Java VMの情報を表示します

- MBean: MBeanの情報を表示します

JConsoleの右上隅にある緑の接続ステータス・アイコンを使用すると、実行中のJava VMからの切断または再接続を行うことができます。「接続」を選択し、ドロップ・ダウン・メニューから「新規接続」を選択すると、実行中の任意の数のJava VMに同時に接続できます。

概要情報の表示

「概要」タブには、CPU使用状況、メモリー使用量、スレッド数、Java VMにロードされたクラスについての、グラフィカルなモニタリング情報がすべて1つの画面に表示されます。

図3-5 「概要」タブ

「概要」タブを使用すれば、以前は複数のタブを切り替えることでしか利用できなかった情報の関連付けが簡単にできます。

図表データの保存

JConsoleでは、図表データをカンマ区切り値(CSV)ファイルに保存できます。図表のデータを保存するには、図表を右クリックして「別名で保存」を選択し、データの保存先のファイルを指定します。どの図表のデータでも、JConsoleのタブに表示されたものであれば、同様に保存できます。

CSV形式は、スプレッドシート・アプリケーションのデータ交換に一般的に使用されています。CSVファイルは、スプレッドシート・アプリケーションにインポートして、そのアプリケーションで図を作成する場合に使用できます。このデータは、2つ以上の名前付き列(カラム)として表示されます。最初の列はタイムスタンプを示します。ファイルをスプレッドシート・アプリケーションにインポートした後、通常は最初の列を選択し、その書式を必要に応じて「日付」または「日付/時間」に変更する必要があります。

メモリー消費のモニタリング

「メモリー」タブには、メモリー消費とメモリー・プールに関する情報が表示されます。

図3-6 「メモリー」タブ

「メモリー」タブの「GCの実行」をクリックすると、いつでもガベージ・コレクションを実行できます。この図は、ヒープ・メモリーと非ヒープ・メモリー、および特定のメモリー・プールについて、Java VMのメモリー使用量の経時的推移を示しています。利用できるメモリー・プールは、使用しているJava VMのバージョンによって異なります。HotSpot Java VMの場合、シリアル・ガベージ・コレクションのメモリー・プールは次のとおりです。

- Eden領域(ヒープ): ほとんどのオブジェクトにメモリーが最初に割り当てられるプール。

- Survivor領域(ヒープ): Eden領域のガベージ・コレクションで残ったオブジェクトを含むプール。

- Tenured世代(ヒープ): Survivor領域である程度の期間存続したオブジェクトを含むプール。

- Permanent世代(非ヒープ): クラスやメソッド・オブジェクトなど、仮想マシン自体を反映したデータをすべて保持するプール。Java VMでクラス・データ共有を使用する場合、この世代は読取り専用領域と読取り/書込み領域に分割されています。

- コード・キャッシュ(非ヒープ): HotSpot Java VMには、ネイティブ・コードのコンパイルとストレージに使用するメモリーを含むコード・キャッシュも含まれます。

これらのメモリー・プールの消費を示す別の図表を表示させるには、「図」ドロップ・ダウン・メニューから必要なオプションを選択します。また、右下隅の「ヒープ」または「非ヒープ」の棒グラフをクリックすると、図表の表示が切り替わります。最後に、メモリー使用量を追跡する時間の範囲指定は、「時間範囲」ドロップ・ダウン・メニューから必要なオプションを選択します。

ガベージ・コレクションを参照してください。

「詳細」領域には、現在のメモリーに関するメトリックスがいくつか表示されます。

- 使用済: 現在使用中のメモリー容量。使用中のメモリーには、すべてのオブジェクト(アクセス可能なものも不能なものも含む)によって使用されているメモリーが含まれます。

- コミット済: Java VMで利用できることが保証されたメモリー容量。確定メモリーの容量は経時的に変わる可能性があります。Java仮想マシンがメモリーをシステムに解放した場合、確定メモリーの容量は、起動時に割り当てられた最初の容量よりも少なくなる可能性があります。確定メモリーの容量は必ず使用中のメモリー容量以上になります。

- 最大: メモリー管理に使用できる最大メモリー容量。この値は変化する場合や定義されていない場合があります。Java VMで使用メモリー容量を確定メモリー容量より大きくしようとすると、使用量が最大以下の場合(たとえば、システムの仮想メモリーが少ない場合)でも、メモリー割当てに失敗することがあります。

- GC時間: ガベージ・コレクションに要した累積時間とその呼出しの総数。複数行に及ぶ場合もあります。各行はJava VMで使用するガベージ・コレクタの1つのアルゴリズムを示します。

右下の棒グラフは、メモリー・プールによって、ヒープおよび非ヒープ・メモリーで使用されるメモリーを示しています。使用メモリーがメモリー使用量しきい値を超えると、棒の色が赤に変わります。メモリー使用量しきい値は、MemoryMXBeanの属性で設定できます。

ヒープおよび非ヒープのメモリー

Java VMが管理するメモリーには、ヒープ・メモリーと非ヒープ・メモリーの2種類があり、いずれもJava VMの起動時に作成されます。

- ヒープ・メモリー: 実行時データ領域であり、Java VMはそこからすべてのクラスのインスタンスと配列にメモリーを割り当てます。ヒープのサイズは可変の場合と固定の場合があります。ガベージ・コレクタは、ヒープ・メモリーをオブジェクトに再利用する自動メモリー管理システムです。

- 非ヒープ・メモリー: すべてのスレッドで共有されるメソッド領域と、Java VMの内部処理や最適化に必要なメモリーが含まれます。非ヒープ・メモリーには、実行定数プール、フィールドおよびメソッド・データ、メソッドおよびコンストラクタのコードなど、クラス単位の構造体が格納されます。メソッド領域は論理的にはヒープの一部ですが、実装方法によっては、Java VMがこの領域のガベージ・コレクトや圧縮を行わない場合もあります。ヒープ・メモリーと同様に、メソッド領域のサイズは固定の場合と可変の場合があります。メソッド領域のメモリーは連続している必要はありません。

メソッド領域に加えて、Java VMには、内部処理または最適化のためのメモリー(これも非ヒープ・メモリーに属します)が必要になる場合もあります。たとえば、JIT (Just-In-Time)コンパイラには、パフォーマンス向上のためにJava VMコードから変換されたネイティブ・マシン・コードを格納するためのメモリーが必要です。

メモリー・プールとメモリー・マネージャ

メモリー・プールとメモリー・マネージャは、Java VMのメモリー・システムの重要な部分です。

- メモリー・プール: Java VMが管理するメモリー領域です。Java VMには少なくとも1つのメモリー・プールがあり、実行中にメモリー・プールを作成または削除できます。メモリー・プールは、ヒープ・メモリーと非ヒープ・メモリーのどちらかに属します。

- メモリー・マネージャ: 1つ以上のメモリー・プールを管理します。ガベージ・コレクタは、メモリー・マネージャの一種で、アクセスできなくなったオブジェクトが使用していたメモリーの再利用を管理しています。Java VMが装備するメモリー・マネージャは1つの場合も複数の場合もあります。実行中にメモリー・マネージャを追加または削除できます。メモリー・プールは、複数のメモリー・マネージャによって管理できます。

ガベージ・コレクション

ガベージ・コレクション(GC)は、参照されていないオブジェクトが使用していたメモリーを解放する、Java VMの仕組みです。アクティブな参照を持つオブジェクトを「生きている」と考え、参照されていない(アクセスできない)オブジェクトを「死んでいる」と考えるのが一般的です。ガベージ・コレクションは、死んだオブジェクトによって使用されていたメモリーを解放するプロセスです。GCによって使用されるアルゴリズムとパラメータがパフォーマンスに劇的な効果をもたらす可能性があります。

Java HotSpot VMガベージ・コレクタは、世代別GCを使用します。世代別GCは、ほとんどのプログラムには次のような傾向があるという所見に基づいています。

- 生成する多くのオブジェクトは短命である(イテレータやローカルの変数など)。

- 生成する一部のオブジェクトは非常に長い寿命を持つ(高度な持続性オブジェクトなど)。

そのため、世代別のGCは、メモリーをいくつかの世代に分け、それぞれにメモリー・プールを割り当てます。ある世代が割り当てられたメモリーを使用すると、VMはメモリー・プール上で部分的なGC (マイナー・コレクションともいう)を実行して、死んだオブジェクトによって使用されたメモリーを再利用します。この部分的なGCは、通常、フルGCよりもはるかに高速です。

Java HotSpot VMは、若い世代(「nursery」ともいう)と古い世代という2つの世代を定義します。若い世代は、1つの「Eden領域」と2つの「Survivor領域」で構成されています。VMは最初にすべてのオブジェクトをEden領域に割り当て、ほとんどのオブジェクトはそこで死にます。マイナーGCを実行するとき、VMは残りのオブジェクトをEden領域からSurvivor領域の1つに移します。VMは、Survivor領域で十分に長く生きるオブジェクトを古い世代の「Tenured」領域に移します。Tenured世代がいっぱいになると、フルGCが実行されます。これは生きているオブジェクトをすべて含むため、通常はマイナーGCよりも時間がかかります。Permanent世代は、クラスやメソッド・オブジェクトなどの仮想マシン自体を反映したデータをすべて保持します。

各世代のデフォルトの配置は、図 3-7のようになります。

図 3-7ガベージ・コレクションのデータの世代

ガベージ・コレクタがボトルネックになる場合、世代のサイズをカスタマイズすることによって、パフォーマンスを向上させることができます。JConsoleを使用して、ガベージ・コレクタのパラメータを試すことで、パフォーマンス・メトリックの感度を調べることができます。Java Platform, Standard Edition HotSpot仮想マシン・ガベージ・コレクション・チューニング・ガイドのパフォーマンスに関する考慮事項を参照してください。

スレッドの使用のモニタリング

「スレッド」タブには、スレッドの使用に関する情報が表示されます。

図3-8 「スレッド」タブ

左下隅の「スレッド」リストには、アクティブなスレッドがすべて表示されます。「フィルタ」フィールドに文字列を入力すると、「スレッド」リストには、入力した文字列を含む名前のスレッドだけが表示されます。「スレッド」リスト内のスレッドの名前をクリックすると、スレッド名や状態、スタック・トレースなど、そのスレッドに関する情報が右に表示されます。

この図は、ライブ・スレッドの数の経時的推移を示しています。次の2本のラインが表示されています。

- 赤: スレッドのピーク数

- 青: ライブ・スレッドの数

Threading MXBeanには、ほかにも「スレッド」タブにない便利な操作があります。

- findMonitorDeadlockedThreads: オブジェクト・モニター・ロックでデッドロックに陥ったスレッドを検出します。この操作は、デッドロックに陥ったスレッドIDの配列を返します。

- getThreadInfo: スレッド情報を返します。これには、名前とスタック・トレースのほか、スレッドが現在ブロックされている場合は該当するモニター・ロック、そのロックを保持しているスレッド、およびスレッド競合統計が含まれます。

- getThreadCpuTime: 指定されたスレッドによるCPUの使用時間を返します。

これらの追加機能に「MBean」タブからアクセスするには、MBeanツリーで「Threading MXBean」を選択します。このMXBeanには、モニターされているJava VMのスレッド情報にアクセスするための属性と操作がすべて一覧表示されます。「MBeanのモニタリングと管理」を参照してください。

デッドロックに陥ったスレッドの検出

アプリケーションがデッドロックに陥ったのかどうかを確認する場合(たとえば、アプリケーションがハング・アップしたように見える場合)、「デッドロックの検出」をクリックすれば、デッドロックに陥ったスレッドを検出できます。デッドロックに陥ったスレッドが検出されると、図3-9のように、「スレッド」タブの横の新しいタブに表示されます。

図3-9 デッドロックに陥ったスレッド

「デッドロックを検出する」を使用すると、オブジェクト・モニターとjava.util.concurrent所有可能シンクロナイザを伴うデッドロック・サイクルを検出できます( java.lang.management.LockInfoのAPI仕様のドキュメントを参照)。Java SEバージョン6.0以降、java.util.concurrentロックのモニタリング・サポートが追加されました。JConsoleがJava SE 5.0 VMに接続している場合、デッドロックの検出メカニズムではオブジェクト・モニターに関するデッドロックのみが検出されます。JConsoleでは、所有可能シンクロナイザに関するデッドロックは表示されません。

スレッドとデーモン・スレッドの詳細は、java.lang.ThreadのAPIドキュメントを参照してください。

クラス・ローディングのモニタリング

「クラス」タブには、クラス・ローディングの情報が表示されます。

図3-10 「クラス」タブ

この図は、ロードされたクラス数の経時的推移を示しています。

- 赤いラインは、ロードされたクラスの総数(そのあとアンロードされたクラスを含む)を表します。

- 青いラインは、現在ロードされているクラスの数を表します。

タブの下の「詳細」セクションには、Java VMの起動後にロードされたクラスの総数、および現在ロードされている数とアンロードされた数が表示されます。クラス・ローディングのトレースを冗長出力に設定するには、右上隅のチェック・ボックスにチェック・マークを入れます。

VM情報の表示

「VMの概要」タブには、Java VMに関する情報が表示されます。

図 3-11「VMの概要」タブ

このタブには次のような情報が表示されます。

- 概要

- アップタイム: Java VMの合計起動時間。

- プロセスCPU時間: Java VMが起動してからCPUを使用した合計時間。

- コンパイルの総時間: JITコンパイルに要した累積時間。Java VMの実装方法によって、JITコンパイルのタイミングが決まります。Hotspot VMは、適応型コンパイルを採用しています。適応型コンパイルでは、VMは標準のインタプリタを使用してアプリケーションを起動しますが、コードの実行中にコードを分析して、パフォーマンスのボトルネック、つまり「ホット・スポット」を検出します。

- スレッド

- ライブ・スレッド: ライブ・デーモン・スレッドおよびデーモンでないライブ・スレッドの現在数。

- ピーク: Java VM起動後のライブ・スレッドの最大数。

- デーモン・スレッド: デーモンのライブ・スレッドの現在数。

- 開始したスレッドの総数: Java VMの起動後に起動されたスレッドの合計数(デーモンおよびデーモン以外のスレッドと終了したスレッドを含む)。

- クラス

- 現在ロードされているクラス: 現在メモリーにロードされているクラスの数。

- ロードされたクラスの総数: Java VMの起動後にメモリーにロードされたクラスの合計数(そのあとアンロードされたものを含む)。

- アンロードされたクラスの総数: Java VMの起動後にメモリーからアンロードされたクラスの数。

- メモリー

- 現在のヒープ・サイズ: 現在、ヒープ単位で占めているKバイト数。

- 確定メモリー: ヒープ用に割り当てられたメモリーの合計容量。

- 最大ヒープ・サイズ: ヒープ単位で占めている最大Kバイト数。

- ファイナライズを保留中のオブジェクト: ファイナライズを待機しているオブジェクト数。

- ガベージ・コレクタ: GCに関する情報(ガベージ・コレクタ名、GCの実行回数、GCの実行に要した合計時間など)。

- オペレーティング・システム

- 総物理メモリー: オペレーティング・システムが保持するランダム・アクセス・メモリー(RAM)の容量。

- 空物理メモリー: オペレーティング・システムが使用可能なRAMの空き容量。

- 確定仮想メモリー: 実行プロセスに使用できることが保証された仮想メモリーの量。

- その他の情報

- VMの引数: アプリケーションがJava VMに渡した入力引数(mainメソッドの引数は含まない)。

- クラス・パス: システム・クラス・ローダーがクラス・ファイルを検索するために使用するクラス・パス。

- ライブラリ・パス: ライブラリをロードするときに検索するパスのリスト。

- ブート・クラスパス: ブートストラップ・クラス・ローダーがクラス・ファイルを検索するために使用するパス。

MBeanのモニタリングと管理

「MBean」タブには、プラットフォームMBeanサーバーに通常の方法で登録されているすべてのMBeanに関する情報が表示されます。「MBean」タブから、フル・セットのプラットフォームMXBeanインストゥルメンテーション(他のタブには表示されないものも含む)にアクセスできます。そのほか、「MBean」タブを使用すれば、アプリケーションのMBeanのモニターと管理もできます。

図3-12 「MBean」タブ

左のツリーは、現在稼動中のすべてのMBeanを示しています。ツリーでMBeanを選択すると、そのMBeanInfoとMBean記述子の両方が右に表示され、その下のツリーには属性、操作、または通知が表示されます。

プラットフォームMXBeanとその各種操作および属性はすべて、JConsoleの「MBean」タブからアクセスできます。

MBeanツリーの作成

デフォルトでは、MBeanはそのオブジェクト名に対応するツリーに表示されます。オブジェクト名の作成時に指定したキー・プロパティの順序は、JConsoleによってMBeanをMBeanツリーに追加するときに保存されます。JConsoleがMBeanツリーの作成に使用する正確なキー・プロパティ・リストは、ObjectName.getKeyPropertyListString()メソッドによって返されます。その場合、最初のキーはtypeで、j2eeTypeがあればそれが2番目のキーとなります。

ただし、ObjectNameキー・プロパティの順序をデフォルトにしておくと、JConsoleがMBeanツリーをレンダリングするときに予想外の動作につながる場合があります。たとえば、2つのオブジェクト名が同じキーをもち、そのキーの順序が異なる場合、対応するMBeanは、MBeanツリーにある同じノードでは作成されません。

たとえば、Triangle MBeanオブジェクトを次の名前で作成するとしましょう。

com.sun.example:type=Triangle,side=isosceles,name=1
com.sun.example:type=Triangle,name=2,side=isosceles
com.sun.example:type=Triangle,side=isosceles,name=3

JMXテクノロジに関するかぎり、これらのオブジェクトはまったく同様に扱われます。オブジェクト名内のキーの順序は、JMXテクノロジにとって重要ではありません。しかし、JConsoleをこれらのMBeanに接続し、デフォルトでレンダリングされたMBeanツリーを使用すると、オブジェクトcom.sun.example:type=Triangle,name=2,side=isoscelesがTriangleノードの下に2というノード名で作成されます。このノード2にはisoscelesというサブノードが追加されます。他の2つの二等辺三角形(name=1とname=3)は、図3-13のように、Triangleの下にisoscelesという別名ノードでグループ化されます。

図 3-13予想外にレンダリングされたMBeanツリーの例

この問題を回避するには、コマンド行でJConsoleを起動するときにキー・プロパティ・リストを正しい順序で入力することにより、MBeanがツリーに表示される順序を指定します。これを実行するには、次のコマンドのように、システム・プロパティcom.sun.tools.jconsole.mbeans.keyPropertyListを設定します。

% jconsole -J-Dcom.sun.tools.jconsole.mbeans.keyPropertyList=key[,key]*

キー・プロパティ・リストのシステム・プロパティにより、キーのカンマ区切りリストは選択された順序で表示されます。この場合のkeyは、必ずオブジェクト名のキーを表す文字列または空の文字列とします。リストで指定されたキーが特定のMBeanに適用されない場合、そのキーは破棄されます。キー・プロパティ・リストで指定されたキーよりも多数のキーがMBeanにある場合、ObjectName.getKeyPropertyListString()の戻り値で定義されたキーの順序が、keyPropertyListで定義されたキーの順序を補完します。したがって、空のキー・リストを指定すると、JConsoleのキーの表示は、MBeanのObjectNameの表示と同じ順序になります。

前述のTriangle MBeanの例に戻ると、JConsoleを起動するときにkeyPropertyListシステム・プロパティを指定すれば、sideが先、nameが後というキー・プロパティの順序に従って、すべてのMBeanがグループ化されます。これを行うには、次のコマンドでJConsoleを起動します。

% jconsole -J-Dcom.sun.tools.jconsole.mbeans.keyPropertyList=side,name

このシステム・プロパティを指定してJConsoleを起動すると、図3-14のようなMBeanツリーが生成されます。

図 3-14 keyPropertyListを使用して生成されたMBeanツリーの例

図 3-14では、sideキーが先、nameキーが後になります。typeキーが最後になるのは、キー・プロパティ・リストに指定されていなかった場合に、MBeanツリーのアルゴリズムによって残りのキーには元のキーの順序が適用されたためです。結果として、typeキーの順序は、keyPropertyListシステム・プロパティで定義されたキーの後になります。

「JMXベスト・プラクティス・ガイドライン」で定義されたオブジェクトの命名規約に従えば、typeキーは必ず先頭にくるはずです。次のシステム・プロパティを使用してJConsoleを起動する必要があります。

% jconsole -J-Dcom.sun.tools.jconsole.mbeans.keyPropertyList=type,side,name

上のコマンドにより、JConsoleは図3-15のようなTriangle MBeanのMBeanツリーを生成します。

図 3-15 JMXベスト・プラクティスに従って生成されたMBeanツリーの例

これで図3-13と図3-14のMBeanツリーよりもわかりやすくなります。

MBean属性

「Attributes」ノードを選択すると、MBeanの属性がすべて表示されます。図 3-16は、ThreadingプラットフォームMXBeanのすべての属性を示しています。

図 3-16すべてのMBean属性の表示

図 3-17のように、ツリーから個別のMBean属性を選択すると、その属性値、MBeanAttributeInfo、関連する記述子が右側のペインに表示されます。

図 3-17個別のMBean属性の表示

属性値が太字で表示されている場合、これをダブルクリックすると、その属性の追加情報が表示されます。たとえば、java.lang.Memory MBeanのHeapMemoryUsage属性の値をクリックすると、図3-18のような図表が表示されます。

図 3-18属性値の表示

属性の数値をダブルクリックすると、その数値の変化を示す図表が表示されます。たとえば、Garbage Collector MBean PS MarksweepのCollectionTime属性をダブルクリックすると、ガベージ・コレクションに要した時間が表示されます。

JConsoleでは、書込み可能な属性値の設定もできます。書込み可能な属性値は青で表示されます。ここにはMemory MBeanのVerbose属性が表示されます。

図 3-19書込み可能な属性値の設定

属性を設定するには、属性をクリックして編集します。たとえば、JConsoleでガベージ・コレクタの冗長トレースを有効または無効にするには、「MBean」タブで「Memory MXBean」を選択し、Verbose属性をtrueまたはfalseに設定します。同様に、クラス・ローディングMXBeanにもVerbose属性があり、これを設定すれば、クラス・ローディング冗長トレースを有効または無効に切り替えることができます。

MBeanの操作

「Operations」ノードを選択すると、MBeanの操作がすべて表示されます。MBean操作はボタンとして表示され、これらをクリックすることで操作を呼び出すことができます。図3-20は、ThreadingプラットフォームMXBeanのすべての操作を示しています。

図 3-20すべてのMBean操作の表示

ツリーから個別のMBean操作を選択すると、図3-21のように、MBean操作を呼び出すボタン、その操作のMBeanOperationInfo、およびその記述子が表示されます。

図 3-21個別のMBean操作の表示

MBeanの通知

通知の受信に登録するには、左ツリーから「Notifications」ノードを選択し、右に表示される「登録」ボタンをクリックします。通知の受信数は角カッコの中に表示され、新しい通知を受信すると「Notifications」ノード自体が太字で表示されます。MemoryプラットフォームMXBeanの通知を図 3-22に示します。

図 3-22 MBean通知の表示

個別のMBean通知を選択すると、図 3-23のように、MBeanNotificationInfoが右側のペインに表示されます。

図 3-23個別のMBean通知の表示

HotSpot Diagnostic MXBean

JConsoleの「MBean」タブでは、HotSpot VMにヒープ・ダンプの実行を指示し、HotSpotDiagnostic MXBeanを使用してVMオプションを取得または設定することもできます。

図 3-24 HotSpot診断MBeanの表示

ヒープ・ダンプを手動で行うには、com.sun.management.HotSpotDiagnostic MXBeanのdumpHeap操作を呼び出します。また、setVMOption操作を使用してHeapDumpOnOutOfMemoryError Java VMオプションを指定し、OutOfMemoryErrorを受け取ると必ずVMで自動的にヒープ・ダンプが実行されるようにすることもできます。

カスタム・タブの作成

既存の標準タブのほか、独自のカスタム・タブをJConsoleに追加して、独自のモニタリング・アクティビティを行うこともできます。JConsoleプラグインAPIには、たとえば、独自のアプリケーションのMBeanにアクセスするタブを追加するメカニズムがあります。JConsoleプラグインAPIは、独自のカスタム・プラグインを作成するために拡張可能なabstractクラスであるcom.sun.tools.jconsole.JConsolePluginを定義しています。

前述のように、独自のプラグインは、JConsolePluginを拡張し、JConsolePlugingetTabsおよびnewSwingWorkerメソッドを実装する必要があります。getTabsメソッドは、JConsoleに追加するタブのリストと空リストのどちらかを返します。newSwingWorkerメソッドは、そのプラグインのGUIを更新するSwingWorkerを返します。

独自のプラグインはJavaアーカイブ(JAR)ファイルで提供され、それにはMETA-INF/services/com.sun.tools.jconsole.JConsolePluginというファイルが入っている必要があります。このJConsolePluginファイル自体には、新しいJConsoleタブとして追加するプラグインの完全修飾クラス名のリストが含まれています。JConsoleは、サービス・プロバイダのロード機能を使用して、プラグインの検索とロードを実行します。JConsolePluginでは、プラグインごとのエントリを1つにして、複数のプラグインをもつこともできます。

新しいカスタム・プラグインをJConsoleにロードするには、JConsoleを次のコマンドで起動します。

%  jconsole -pluginpath plugin-path

前のコマンドで、plugin-pathは、検索するJConsoleプラグインへのパスを指定しています。これらのパスではディレクトリ名またはJARファイルを指定し、プラットフォームの標準区切り文字を使用して複数のパスを指定することもできます。

Java SE 9プラットフォームにはJConsoleプラグインのサンプルが付属します。JTopアプリケーションは、このアプリケーションで実行されるすべてのスレッドのCPU使用状況を示すJDKデモ・アプリケーションです。このデモはCPU消費が多いスレッドの識別に便利で、JConsoleプラグインやスタンドアロンのGUIとして使用できるように更新されています。JTopは、デモ・アプリケーションとしてJava SE 9プラットフォームにバンドルされています。JTopプラグインを使用してJConsoleを起動するには、次のコマンドを実行します。

% JDK_HOME/bin/jconsole -pluginpath JDK_HOME/demo/management/JTop/JTop.jar

このJConsoleのインスタンスに接続すると、「JTop」タブが追加され、実行中の各種スレッドのCPU使用状況が表示されます。

図 3-25カスタム・プラグイン・タブの表示

4 プラットフォームMBeanサーバーとプラットフォームMXBeanの使用

このトピックでは、Java Platform, Standard Edition (Java SE)の一部として提供されるMBeanサーバーとMXBeanについて説明します。MBeanサーバーとMXBeanは、モニタリングおよび管理の目的で使用できます。Java Management Extensions (JMX)テクノロジのMBeanとMBeanサーバーについては、Java SEモニタリングおよび管理の概要に概要が記されています。Java Platform, Standard Edition Java Management ExtensionsガイドのJMXテクノロジの概要を参照してください。

プラットフォームMBeanサーバーの使用

MBeanサーバーは、管理アプリケーションからMBeanにアクセスできるようにするMBeanのリポジトリです。アプリケーションはMBeanに直接アクセスしませんが、その一意のObjectNameクラスを使用して、MBeanサーバー経由でMBeanにアクセスします。MBeanサーバーには、インタフェースjavax.management.MBeanServerが実装されています。

プラットフォームMBeanサーバーとは、Java SE 5.0で導入されたもので、Java仮想マシン(Java VM)に組み込まれたMBeanサーバーのことです。プラットフォームMBeanサーバーは、Java VMで実行する、現在管理下にあるすべてのコンポーネントで共有できます。java.lang.management.ManagementFactoryのメソッドgetPlatformMBeanServerを使用して、プラットフォームMBeanサーバーにアクセスします。もちろんjavax.management.MBeanServerFactoryクラスを使用して独自のMBeanサーバーを構築することもできます。ただし、通常、MBeanサーバーが複数存在する必要はないため、プラットフォームMBeanサーバーの使用をお薦めします。

プラットフォームMXBeanへのアクセス

プラットフォームMXBeanは、Java VMのモニタリングおよび管理を実施するMBeanです。各MXBeanでは、VM機能の一部をカプセル化します。プラットフォームで提供されるMXBeanの完全なリストは、表1-1に示されています。

管理アプリケーションでは、次の3種類の方法で、プラットフォームMXBeanにアクセスできます。

- ManagementFactoryクラスからの直接アクセス

- MXBeanプロキシからの直接アクセス

- MBeanServerConnectionクラスからの間接アクセス

ManagementFactoryクラスを使用したプラットフォームMXBeanへのアクセス

アプリケーションは、自身のJava VMと同一Java VMで稼働するプラットフォームMXBeanのメソッドに対して直接呼出しを行うことができます。直接呼出しには、ManagementFactoryクラスのstaticメソッドを使用できます。ManagementFactoryには、getClassLoadingMXBean()、getGarbageCollectorMXBeans()、getRuntimeMXBean()などの様々なプラットフォームMXBeanにそれぞれ対応するaccessorメソッドが用意されています。プラットフォームMXBeanが複数存在する場合、そのメソッドは検出したプラットフォームMXBeanのリストを返します。

たとえば、例 4-1では、ManagementFactoryのstaticメソッドを使用してプラットフォームMXBeanのRuntimeMXBeanを取得し、さらにプラットフォームMXBeanからベンダー名を取得します。

例4-1 ManagementFactoryクラスを使用したプラットフォームMXBeanへのアクセス

RuntimeMXBean mxbean = ManagementFactory.getRuntimeMXBean();
String vendor = mxbean.getVmVendor();

MXBeanプロキシを使用したプラットフォームMXBeanへのアクセス

アプリケーションでは、MXBeanプロキシを使用してプラットフォームMXBeanメソッドを呼び出すこともできます。これを行うには、staticメソッドManagementFactory.newPlatformMXBeanProxy()を呼び出して、指定されたMBeanサーバーにメソッドの呼出しを転送するMXBeanプロキシ・インスタンスの作成が必要となります。アプリケーションでは、通常別のJava VMのプラットフォームMXBeanに対するリモート・アクセスを可能とするプロキシを作成します。

たとえば、例4-2では、例4-1とまったく同じ処理を実行しますが、ここではMXBeanプロキシを使用します。

例4-2 MXBeanプロキシを使用したプラットフォームMXBeanへのアクセス

MBeanServerConnection mbs;
...
// Get a MBean proxy for RuntimeMXBean interface
RuntimeMXBean proxy =
ManagementFactory.newPlatformMXBeanProxy(mbs,
ManagementFactory.RUNTIME_MXBEAN_NAME,
RuntimeMXBean.class);
// Get standard attribute "VmVendor"
String vendor = proxy.getVmVendor();

MBeanServerConnectionクラスを使用したプラットフォームMXBeanへのアクセス

アプリケーションは、別の実行中のJava VMのプラットフォームMBeanサーバーに接続されているMBeanServerConnectionインタフェースを経由してプラットフォームMXBeanメソッドを間接的に呼び出すことができます。MBeanServerConnectionクラスのgetAttribute()メソッドを使用して、MBeanのObjectNameと属性名をパラメータとして指定することで、プラットフォームMXBeanの属性を取得します。

たとえば、例4-3では、例4-1および例4-2と同じジョブを実行しますが、MBeanServerConnectionを介した間接的な呼出しを使用します。

例4-3 MBeanServerConnectionクラスを使用したプラットフォームMXBeanへのアクセス

MBeanServerConnection mbs;
...
try {
ObjectName oname = new ObjectName(ManagementFactory.RUNTIME_MXBEAN_NAME);
// Get standard attribute "VmVendor"
String vendor = (String) mbs.getAttribute(oname, "VmVendor");
} catch (....) {
// Catch the exceptions thrown by ObjectName constructor
// and MBeanServer.getAttribute method
...
}

Oracle JDKのプラットフォーム拡張機能の使用

Java VMでは、プラットフォームに特化した測定に必要なインタフェースと管理操作を定義することにより管理インタフェースを拡張できます。ManagementFactoryクラスのstaticファクトリ・メソッドは、プラットフォーム拡張機能を備えたMBeanを返します。

com.sun.managementパッケージには、Oracle JDKのプラットフォーム拡張機能が含まれています。次の各セクションでは、Oracle JDKのOperatingSystemMXBeanインタフェースの実装からプラットフォーム固有の属性にアクセスする方法の例について説明します。

MXBeanの各種属性に対する直接アクセス

例4-4では、Oracle JDKのMXBeanインタフェースの1つに対して直接アクセスを行っています。

例 4-4 MXBean属性に対する直接アクセス

com.sun.management.OperatingSystemMXBean mxbean =
(com.sun.management.OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();

// Get the number of processors
int numProcessors = mxbean.getAvailableProcessors();

// Get the Oracle JDK-specific attribute Process CPU time
long cpuTime = mxbean.getProcessCpuTime();

MBeanServerConnectionを使用したMXBean属性へのアクセス

例4-5では、MBeanServerConnectionクラスを使用して、Oracle JDKのMXBeanインタフェースの1つにアクセスします。

例4-5 MBeanServerConnectionを使用したMXBean属性へのアクセス

MBeanServerConnection mbs;

// Connect to a running Java VM (or itself) and get MBeanServerConnection
// that has the MXBeans registered in it
...

try {
// Assuming the OperatingSystem MXBean has been registered in mbs
ObjectName oname = new ObjectName(ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME);

// Get standard attribute "Name"
String vendor = (String) mbs.getAttribute(oname, "Name");

// Check if this MXBean contains Oracle JDK's extension
if (mbs.isInstanceOf(oname, "com.sun.management.OperatingSystemMXBean")) {
// Get platform-specific attribute "ProcessCpuTime"
long cpuTime = (Long) mbs.getAttribute(oname, "ProcessCpuTime");
}
} catch (....) {
// Catch the exceptions thrown by ObjectName constructor
// and MBeanServer methods
...
}

スレッドの競合およびCPU時間のモニタリング

プラットフォームMXBeanのThreadMXBeanでは、スレッドの競合とスレッドのCPU時間のモニタリングをサポートします。

Oracle JDKのHotSpot VMでは、スレッドの競合のモニタリングをサポートしています。Java VMでスレッドの競合のモニタリングがサポートされているかどうかを判断するには、ThreadMXBean.isThreadContentionMonitoringSupported()メソッドを使用します。デフォルト時は、スレッドの競合のモニタリングが無効になっています。有効にするには、setThreadContentionMonitoringEnabled()メソッドを使用します。

Oracle JDKのHotSpot VMでは、ほとんどのプラットフォームにおいてスレッドのCPU時間の測定をサポートしています。このインタフェースで発生するCPU時間は、その単位の精度がナノ秒となっていますが、ここではこれほどの精度は要求されません。

Java VMがどのスレッドのCPU時間の測定もサポートしていることを判断するには、isThreadCpuTimeSupported()メソッドを使用します。Java VMで現スレッドのCPU時間を測定できるかどうかを判断するには、isCurrentThreadCpuTimeSupported()を使用します。スレッドのCPU時間の測定をサポートするJava VMでは、現スレッドのCPU時間もサポートします。

Java VMでは、スレッドのCPU時間の測定を無効にすることができます。スレッドのCPU時間の測定が有効になっているかどうかを判断するには、isThreadCpuTimeEnabled()メソッドを使用します。スレッドのCPU時間の測定を有効/無効にするには、setThreadCpuTimeEnabled()メソッドを使用します。

オペレーティング・システムの管理

プラットフォームMXBeanのOperatingSystemでは、次に示すような特定のオペレーティング・システムのリソース情報にアクセスできます。

- プロセスCPU時間

- 物理メモリーの総容量と空き容量

- 仮想メモリーの確定容量(プロセスの実行に使用可能な仮想メモリーの容量)

- スワップ空間の総容量および空き容量

- 開いているファイル記述子の数(Solaris、LinuxまたはmacOSプラットフォームのみ)。

JConsoleの「MBean」タブでオペレーティング・システムのMXBeanを選択すると、そのプラットフォームの拡張機能を含むすべての属性と動作が表示されます。数値属性の値フィールドをダブルクリックすることにより、この数値属性の長期にわたる値の変化をモニターできます。

ロギングの管理

Java SEプラットフォームでは、ロギングを目的とした特殊なMXBean (LoggingMXBeanインタフェース)を提供します。

LoggingMXBeanインタフェースでは、次のタスクを実行できます。

- 指定したロガーと関連付けられているログ・レベルの名前を取得

- 現在登録済みのロガーのリストを取得

- 指定したロガーの親の名前を取得

- 指定の新しいレベルに指定のロガーを設定

LoggingMXBeanの一意のObjectNameは、java.util.logging:type=Loggingです。このオブジェクト名は、LogManager.LOGGING_MXBEAN_NAMEに格納されます。

LogManager.getLoggingMXBean()の呼出しにより取得が可能な、LoggingMXBeanインタフェースの単一のグローバル・インスタンスが用意されています。

LoggingMXBeanインタフェースは、ロガー名のリストを示すLoggerNames属性を定義します。使用中のアプリケーションでロガーのリストを検出するには、「MBean」タブでjava.util.loggingドメインのLogging MXBeanインタフェースを選択し、LoggerNames属性の値フィールドをダブルクリックします。

Logging MXBeanインタフェースでは、次の2つの操作もサポートされます。

- getLoggerLevel: 既定のロガーのログ・レベルを返します

- setLoggerLevel: 既定ロガーのログ・レベルを新たなレベルに設定します

これらの処理では、ロガー名を第1パラメータとして取得します。ロガーのレベルを変更するには、ロガー名を第1パラメータに入力し、そのレベルの名前をsetLoggerLevel操作の第2パラメータに設定します。

ロー・メモリーの検出

メモリーの使用は、メモリー・システムの重要な要素となります。これは、次の問題の可能性を示唆しています。

- アプリケーションの過度のメモリー消費

- 自動メモリー管理システムへの過度の負荷

- 潜在的なメモリー・リーク

ロー・メモリー状態の検出に使用可能なメモリーのしきい値には、使用量しきい値とコレクション使用量しきい値の2種類が用意されています。ポーリングまたはしきい値通知でこれらのしきい値のいずれかを使用して、ロー・メモリー状態を検出できます。

メモリーしきい値

メモリー・プールには、使用量しきい値およびコレクション使用量しきい値の2種類のメモリーしきい値を設定することができます。これらのしきい値のどちらか一方は、特定のメモリー・プールでサポートされない可能性があります。使用量しきい値とコレクション使用量しきい値の値は、JConsoleの「MBean」タブで設定できます。

使用量しきい値

使用量しきい値とは、管理可能な、一部のメモリー・プールの属性を意味します。オーバーヘッドを低く抑えた状態でメモリーの使用状況をモニターすることができます。しきい値を正の値に設定すると、メモリー・プールは使用量しきい値をチェックすることができます。使用量しきい値に0を設定すると、この使用量しきい値のチェック機能が無効となります。デフォルト値は、Java VMで用意されています。

Java VMは、メモリー・プールにおいてほぼ適切なタイミングで(一般的にガベージ・コレクションが発生している間に)、この使用量しきい値のチェック機能を実行します。各メモリー・プールは、使用量がしきい値を超える場合に常にその使用量しきい値の数を増加します。

一部のメモリー・プールにとって使用量しきい値は適当ではないため、isUsageThresholdSupported()メソッドを使用してメモリー・プールが使用量しきい値をサポートしているかどうかを確認します。たとえば、世代別ガベージ・コレクタ(HotSpot VMのものなど。ガベージ・コレクションを参照)では、Edenメモリー・プールからほとんどのオブジェクトが若い世代の方に割り当てられます。なお、Edenプールはその容量がいっぱいになるように設計されています。Edenメモリー・プールのガベージ・コレクションにより、そのメモリー領域のほとんどが解放されます。これは、Edenメモリー・プールに含まれるオブジェクトのほとんどが、ガベージ・コレクション時にはアクセス不可能な短命なオブジェクトであると予想されるためです。このため、Edenメモリー・プールは、使用量しきい値をサポートするのに適していません。

コレクション使用量しきい値

コレクション使用量しきい値とは、ガベージ・コレクトされた一部のメモリー・プールの属性を意味し、この属性は管理できるようになっています。Java VMでメモリー・プールのガベージ・コレクトを行うと、そのメモリー・プール中の一部のメモリーはそれ以後も引き続き使用中の状態のままとなります。コレクション使用量しきい値により、このメモリーの値を設定することができます。プールでコレクション使用量しきい値がサポートされているかどうかを判断するには、MemoryPoolMXBeanインタフェースのisCollectionUsageThresholdSupported()メソッドを使用します。

Java VMは、ガベージ・コレクションを行うときに、メモリー・プールにおけるコレクション使用量しきい値をチェックする場合があります。なお、このチェック機能を有効にするには、このしきい値に正の値を設定します。チェック機能を無効にする場合は、この値に0 (デフォルト値)を設定します。

使用量しきい値、とコレクション使用量しきい値は、いずれも「JConsole」の「MBean」タブで設定することができます。

メモリーMXBean

プラットフォームMemoryMXBeanを使用してメモリーの様々なしきい値を管理することができます。MemoryMXBeanでは、次の4つの属性を定義します。

- HeapMemoryUsage: 現在のヒープ・メモリーの使用状況を示す読取り専用の属性です。

- NonHeapMemoryUsage: 非ヒープ・メモリーの使用状況を示す読取り専用の属性です。

- ObjectPendingFinalizationCount: ファイナライズを保留しているオブジェクトの数を示す読取り専用の属性です。

- Verbose: ガベージ・コレクション(GC)の冗長トレース設定を示すブール型の属性です。この値は動的に設定することができます。GCの冗長トレースは、Java VMを開始する際に指定した位置に表示されます。Hotspot VMのGC冗長出力におけるデフォルトの位置は、stdoutとなります。

メモリーMXBeanでは、明示的にガベージ・コレクションを要求できるよう、処理gcを1つサポートしています。

メモリーMXBeanのインタフェースに関する詳細は、java.lang.management.MemoryMXBean仕様に定義されています。

メモリー・プールMXBean

プラットフォームMXBeanのMemoryPoolMXBeanでは、メモリーのしきい値を管理するために一連の処理を定義します。

- getUsageThreshold()

- setUsageThreshold(long threshold)

- isUsageThresholdExceeded()

- isUsageThresholdSupported()

- getCollectionUsageThreshold()

- setCollectionUsageThreshold(long threshold)

- isCollectionUsageThresholdSupported()

- isCollectionUsageThresholdExceeded()

各メモリー・プールには、ロー・メモリーの検出をサポートする上で、使用量しきい値およびコレクション使用量しきい値の2種類のメモリーしきい値が用意されています。これらのしきい値のどちらか一方は、特定のメモリー・プールでサポートされない可能性があります。詳しくは、MemoryPoolMXBeanクラスのAPIリファレンス・ドキュメントを参照してください。

ポーリング

アプリケーションでは、すべてのメモリー・プール用のgetUsage()メソッド、または使用量しきい値をサポートするメモリー・プール用のisUsageThresholdExceeded()メソッドを呼び出すことにより、アプリケーション自体のメモリー使用量を継続的にモニターできます。

例 4-6では、タスクの配置と処理のために設けられた専用のスレッドが使用されています。各間隔では、メモリーの使用量に基づき新しいタスクの受け取りや処理を行うかどうかを判断します。メモリーの使用量がその使用量しきい値を上回る場合、そのメモリーの使用量がしきい値を下回るまで、別のVMに未処理のタスクを再配置し、新しいタスクを受け取らないようにします。

例4-6 ポーリングの使用

pool.setUsageThreshold(myThreshold);
....
boolean lowMemory = false;
while (true) {
if (pool.isUsageThresholdExceeded()) {
lowMemory = true;
redistributeTasks();  // redistribute tasks to other VMs
stopReceivingTasks();  // stop receiving new tasks
} else {
if (lowMemory) { // resume receiving tasks
lowMemory = false;
resumeReceivingTasks();
}
// processing outstanding task
...
}
// sleep for sometime
try {
Thread.sleep(sometime);
} catch (InterruptedException e) {
...
}
}

例 4-6では、メモリーの使用量がその使用量しきい値を一時的に下回る場合と、2つの繰返し間においてメモリーの使用量がしきい値を上回ったままの状態である場合の区別がありません。getUsageThresholdCount()メソッドから返される使用量しきい値の数を使用して、2つのポーリング間でメモリーの使用量がしきい値を下回る値を返すかどうかを判断します。

かわりにコレクション使用量しきい値をテストするには、例4-6と同じ方法で、isCollectionUsageThresholdSupported()、isCollectionThresholdExceeded()およびgetCollectionUsageThreshold()メソッドを使用します。

しきい値通知

MemoryMXBeanインタフェースでメモリー・プールが使用量しきい値に到達しているか、上回っていることが検出されたときは、使用量しきい値超過通知が発行されます。使用量がしきい値を下回り、再び上回るまで、MemoryMXBeanインタフェースは、別の使用量しきい値超過通知を発行しません。同様に、ガベージ・コレクション後のメモリーの使用量が、コレクション使用量しきい値を上回ると、MemoryMXBeanインタフェースはコレクション使用量しきい値超過通知を発行します。

例 4-7は、例 4-6と同じロジックを実装していますが、ロー・メモリー状態を検出するために使用量しきい値通知を使用します。通知を受け取ると、リスナーは、未処理タスクの再配置、新タスクの受け入れ拒否、新タスクの再受け入れなどのアクションを実行するために別のスレッドの通知を行います。

一般に、以後の通知の遅れを回避するために、処理量を最小限にするhandleNotificationメソッドを設計する必要があります。時間を浪費するアクションは別のスレッドにおいて実行するようにしてください。複数のスレッドで同時に通知リスナーを呼び出すことができるため、リスナーは、実行するタスクを正しく同期させる必要があります。

例 4-7しきい値通知の使用

class MyListener implements javax.management.NotificationListener {
public void handleNotification(Notification notification, Object handback)  {
String notifType = notification.getType();
if (notifType.equals(MemoryNotificationInfo.MEMORY_THRESHOLD_EXCEEDED)) {
// potential low memory, redistribute tasks to other VMs & stop receiving new tasks.
lowMemory = true;
notifyAnotherThread(lowMemory);
}
}
}

// Register MyListener with MemoryMXBean
MemoryMXBean mbean = ManagementFactory.getMemoryMXBean();
NotificationEmitter emitter = (NotificationEmitter) mbean;
MyListener listener = new MyListener();
emitter.addNotificationListener(listener, null, null);

このメモリー・プールで使用量しきい値をサポートするものと仮定する場合、しきい値(値を上回るとアプリケーションで新タスクを受け入れなくなるしきい値)をある値(バイト数表記)に設定することができます。

pool.setUsageThreshold(myThreshold);

この後、使用量しきい値の検出が有効となり、MyListenerクラスによって通知が処理されます。

5 SNMPモニタリングと管理

Simple Network Management Protocol (SNMP)は、ネットワーク管理の業界標準に位置付けられます。SNMPで管理されるオブジェクトは、管理情報ベース(MIB)に配置されます。SNMPエージェントは、Java仮想マシン(Java VM)のインストゥルメンテーション用として標準のMIBを公開しています。JVM-MANAGEMENT-MIB.mibファイルは、Java VMのモニタリングおよび管理用の標準MIBです。

SNMPエージェントの有効化

SNMPを使用してJava VMをモニターするには、Java VMの起動時にまずSNMPエージェントを有効にする必要があります。シングル・ユーザー環境またはマルチユーザー環境のいずれかのSNMPエージェントを有効にすることができます。以後、Java VMはSNMP準拠のツールを使用してモニターすることができます。

Java VMの起動時のシステム・プロパティの設定に関する一般的な情報は、システム・プロパティの設定を参照してください。シングル・ユーザー環境およびマルチユーザー環境でSNMPエージェントを有効にする方法は、後続のセクションで説明されています。プロセスは、いずれの環境でも同一ですが、実行するアクションはわずかに異なります。

アクセス・コントロール・リスト・ファイル

アクセス・コントロール・リスト(ACL)テンプレート・ファイルは、Java Platform, Standard Edition (Java SEプラットフォーム)と一緒に提供され、JRE_HOME/lib/management/snmp.acl.templateにあります。ここで、JRE_HOMEは、Java Runtime Environment (JRE)実装がインストールされているディレクトリです。このファイルは、シングル・ユーザー環境かマルチユーザー環境かに応じて、JRE_HOME/lib/management/snmp.aclまたはホーム・ディレクトリにコピーします。自分のみに読取り権限が割り当てられていることを確認してください。これは、このファイルに暗号化されていないSNMPコミュニティ文字列が含まれているためです。セキュリティ上の理由から、システムでは、所有者のみがこのファイルに対する読取り権を所持していることを確認し、この条件が満たされない場合はエラーでシステムが終了します。したがって、マルチユーザー環境では、このファイルをホーム・ディレクトリなどの非公開の場所に保存する必要があります。

例 5-1では、ACLファイルに存在する可能性のあるエントリの一部を示します。

例 5-1サンプルのACLエントリ

#The communities public and private are allowed access from the local host.
acl = {
{
communities = public, private
access = read-only
managers = localhost
}
}
# Traps are sent to localhost only
trap = {
{
trap-community = public
hosts = localhost
}
}

シングル・ユーザー環境においてSNMPエージェントを有効にする方法

1. Java VMの起動時に、次のシステム・プロパティを設定します。

com.sun.management.snmp.port=portNum

portNumは、モニタリングに使用するポート番号を表します。このプロパティの設定を行うことにより、着信SNMP要求の指定のポート番号上で待機するSNMPエージェントを開始します。

2. ACLファイルを作成します。
ACLテンプレート・ファイルをJRE_HOME/lib/management/snmp.acl.templateからJRE_HOME/lib/management/snmp.aclにコピーします。

3. ACLファイルにアクセス権を設定します。
所有者だけがACLファイルを読み取ることができることを確認し、必要に応じてコミュニティ文字列を追加します。

マルチユーザー環境においてSNMPエージェントを有効にする方法

1. Java VMの起動時に、次のシステム・プロパティを設定します。

com.sun.management.snmp.port=portNum
com.sun.management.snmp.acl.file=ACLFilePath

ACLFilePathは、ACLファイルへのパスを表します。

2. ACLファイルを作成します。
ACLテンプレート・ファイルをJRE_HOME/lib/management/snmp.acl.templateからホーム・ディレクトリ内のsnmp.aclという名前のファイルにコピーします。

3. ACLファイルにアクセス権を設定します。
所有者だけがACLファイルを読み取ることができることを確認し、必要に応じてコミュニティ文字列を追加します。

SNMPモニタリングと管理のプロパティ

構成ファイルまたはコマンド行のいずれかにおいてSNMPのモニタリング・プロパティと管理プロパティの設定を行うことができます。コマンド行で指定したプロパティにより、構成ファイル内のプロパティをオーバーライドします。構成ファイルのデフォルトの場所は、JRE_HOME/lib/management/management.propertiesです。Java VMでは、コマンド行のプロパティcom.sun.management.snmp.portの設定を行う場合はこの構成ファイルを読み取ります。

次のコマンド行オプションで、構成ファイルに別の場所を指定できます。

com.sun.management.config.file=ConfigFilePath

前述のプロパティのConfigFilePathは、構成ファイルへのパスです。

Java VMを始動させる際には、すべてのシステム・プロパティを指定する必要があります。Java VMが起動した後は、システム・プロパティ(たとえば、setPropertyメソッドを使用)、パスワード・ファイル、ACLファイル、または構成ファイルへのどのような変更も反映されません。

表 5-1にすべてのSNMP管理プロパティを示します。

表5-1 SNMPモニタリングと管理のプロパティ

プロパティ名

説明

デフォルト

com.sun.management.snmp.trap

SNMPエージェントがトラップを送信するリモート・ポート。

162

com.sun.management.snmp. interface

オプション。ローカル・ホストInetAddress,は、所定のInetAddressに対するバインドをSNMPエージェントに強制します。特定のサブネットのみを待機する場合、これはマルチホーム・ホスト用となります。

なし

com.sun.management.snmp.acl

SNMP ACLのチェックの有効化または無効化。

true

com.sun.management.snmp. acl.file

有効なACLファイルへのパス。Java VMが起動したあとは、ACLファイルを修正しても効果は得られません。

JRE_HOME/lib/management/snmp.acl

構成エラー

SNMPエージェントの起動中になんらかのエラーが発生すると、Java VMは例外をスローして終了します。構成エラーには、次のようなものがあります。

- ポート番号に対するバインドの失敗。

- 所有者以外のユーザーがパスワード・ファイルを読み取ることができる。

- 無効なSNMP ACLファイル。

アプリケーションでセキュリティ・マネージャを実行する場合、セキュリティ・アクセス権ファイルに追加のアクセス権を登録する必要があります。

6 Java Discovery Protocol (JDP)

Java Discovery Protocol (JDP)は、同じネットワーク・サブネットで管理可能なJVMを検出するテクノロジ(特に、Java Mission ControlおよびJava Flight Recorder)を使用できるようにするプロトコルです。

管理可能なJVMとは、Java Management Extensions (JMX)エージェントを実行しているJVMです。JDPはマルチキャストベースであり、ビーコンのように動作します。つまり、外部JMXエージェントへの接続に必要なJMXサービスURL (JMXServiceURLクラスを参照)をブロードキャストします。これにより、失敗したJVMまたはモニタリングできなくなったJVMを検出するテクノロジを使用できるようになります。

JDPの有効化と構成

JDPを有効にするには、Javaアプリケーションの起動時にコマンド行で次のオプションを指定します。

-Dcom.sun.management.jmxremote.autodiscovery=true

注意:
JDPを有効にしても、JMXのセキュリティに影響はありません。JMXのセキュリティの有効化と構成については、JMXテクノロジを使用するモニタリングと管理を参照してください。

表6-1に、JDPの構成で使用する可能性のあるその他のオプションを示します。

表6-1 JDPのプロパティ

プロパティ

説明

デフォルト値

-Dcom.sun.management.autodiscovery

ネットワーク・サブネットでの自動検出(JDP)を有効にします

false

-Dcom.sun.management.jdp.pause

ブロードキャスト間隔を秒単位で指定します

5

-Dcom.sun.management.jdp.ttl

自動検出パケットの存続時間(秒単位)

1

-Dcom.sun.management.jdp.address

自動検出パケットを送信するマルチキャスト・アドレス

224.0.23.178

-Dcom.sun.management.jdp.port

自動検出パケットを送信するマルチキャスト・ポート。com.sun.management.autodiscoveryプロパティが設定されていない場合でも、自動検出を有効にします。

7095

-Dcom.sun.management.jdp.name

JVMのブロードキャスト名

デフォルトなし

-Dcom.sun.management.jdp.source_addr

ブロードキャストに使用するソース・インタフェースのアドレス

自動割当て

Oracleの法律上の注意点

コピーライト

Copyright © 1994-2017, Oracle and/or its affiliates. All rights reserved.

ライセンス制約の保証と結果的に生じる損害の免責

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

保証免責

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクルまでご連絡ください。

制限付権利について

このソフトウェアまたは関連ドキュメントを、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供する場合は、次の通知が適用されます。

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations. As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs. No other rights are granted to the U.S. Government.

危険な用途への使用について

このソフトウェアまたはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアまたはハードウェアは、危険が伴うアプリケーション(人的傷害を発生させる可能性があるアプリケーションを含む)への用途を目的として開発されていません。このソフトウェアまたはハードウェアを危険が伴うアプリケーションで使用する際、安全に使用するために、適切な安全装置、バックアップ、冗長性(redundancy)、その他の対策を講じることは使用者の責任となります。このソフトウェアまたはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、Oracle Corporationおよびその関連会社は一切の責任を負いかねます。

商標と登録商標について

OracleおよびJavaはオラクルおよびその関連会社の登録商標です。その他の社名、商品名等は各社の商標または登録商標である場合があります。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXは、The Open Groupの登録商標です。

第三者のコンテンツ、製品、サービスに対する免責事項

このソフトウェアまたはハードウェア、そしてドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。適用されるお客様とOracle Corporationとの間の契約に別段の定めがある場合を除いて、Oracle Corporationおよびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。適用されるお客様とOracle Corporationとの間の契約に定めがある場合を除いて、Oracle Corporationおよびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても一切の責任を負いかねます。

Pre-General Availability (一般提供前)版のドキュメントについて

このドキュメントがPre-General Availability (一般提供前)版の場合:

このドキュメントはPre-General Availability (一般提供前)版であり、デモおよび暫定使用のみを目的としたものです。このソフトウェアを使用するハードウェアに限定するものではありません。Oracle Corporationおよびその関連会社は、このドキュメントに関して一切の責任を負わず、いかなる保証もいたしません。また、このドキュメントを使用したことによって損失、費用、あるいは損害が発生しても、一切の責任を負いかねます。

非公開のPre-General Availability (一般提供前)版のドキュメントについて

このドキュメントが非公開のPre-General Availability (一般提供前)版の場合:

このドキュメントに含まれる情報は、情報の共有のみを目的としたものであって、顧客諮問委員会(Customer Advisory Board)のメンバーとしてのお客様の立場でのみ、またはお客様のPre-General Availability Trial Agreement (Pre-GAトライアル契約)のみに従って検討されるべきものとします。マテリアル、コード、または機能の提供をお約束するものではなく、購入決定を行う際の判断材料とすべきではありません。このドキュメントに記載されている特徴または機能の開発、リリースおよび時期については、オラクルの裁量により決定されます。

このドキュメントには、ソフトウェアまたは印刷物などの形式を問わず、オラクルが独占的な権利を有する財産的情報が含まれています。この機密資料へのアクセスと使用は、お客様とオラクルとの間で締結され、お客様が遵守に同意した、Oracle Master Agreement、Oracle License and Oracle Services Agreement (オラクル・ライセンスおよびサービスに関する契約書)、Oracle Partner Network Agreement、Oracle Distribution Agreementまたはその他のライセンス契約の条件に従うものとします。このドキュメントとその内容の開示、コピー、複製および配布には、オラクルによる事前の承諾を必要とします。このドキュメントはライセンス契約の一部となるものではなく、オラクルおよびその子会社や関連会社との契約を構成するものではありません。

ドキュメントのアクセシビリティ

オラクルのアクセシビリティについての詳細情報は、Oracle Accessibility ProgramのWebサイト(http://www.oracle.com/pls/topic/lookup?ctx=acc&id=docacc)を参照してください。

Oracle Supportへのアクセス

サポートをご契約のお客様には、My Oracle Supportを通して電子支援サービスを提供しています。詳細情報は(http://www.oracle.com/pls/topic/lookup?ctx=acc&id=info)か、聴覚に障害のあるお客様は(http://www.oracle.com/pls/topic/lookup?ctx=acc&id=trs)を参照してください。