第14章 JVM


14.1. JVM

14.1.1. JVM 設定

Java Virtual Machine(JVM)設定の設定は、管理対象ドメインとスタンドアロンサーバーインスタンスによって異なります。管理対象ドメインでは、JVM 設定は host.xml および domain.xml 設定ファイルで宣言され、サーバープロセスを起動および停止するドメインコントローラーコンポーネントによって決定されます。スタンドアロンサーバーインスタンスでは、起動時にサーバーの起動プロセスがコマンドライン設定を渡すことができます。これらはコマンドラインまたは管理コンソールの システムプロパティー画面を 使用して宣言できます。
注記
JAVA_OPTS で設定されていないシステムプロパティーは、起動時に JBoss モジュールによって使用されるプロパティーには使用できません。また、java.util.logging.manager などの他の JVM プロパティーには使用できません。

管理対象ドメイン

管理対象ドメインの重要な機能は、複数のレベルで JVM 設定を定義する機能です。カスタム JVM 設定は、ホストレベル、サーバーグループ、またはサーバーインスタンスにより設定できます。より特殊な子要素は親設定を上書きし、グループまたはホストレベルで除外せずに特定のサーバー設定を宣言できます。これにより、設定が設定ファイルで宣言されるか、実行時に渡されるまで、親設定を他のレベルで継承できます。

例14.1 ドメイン設定ファイルの JVM 設定

以下の例は、domain.xml 設定ファイルのサーバーグループに対する JVM 宣言を示しています。
<server-groups>
       <server-group name="main-server-group" profile="default">
           <jvm name="default">
               <heap size="64m" max-size="512m"/>
           </jvm>
           <socket-binding-group ref="standard-sockets"/>
       </server-group>
       <server-group name="other-server-group" profile="default">
           <jvm name="default">
               <heap size="64m" max-size="512m"/>
           </jvm>
           <socket-binding-group ref="standard-sockets"/>
       </server-group>
</server-groups>
このインスタンスでは、main-server-group という名前のサーバーグループが 64 メガバイトのヒープサイズと最大ヒープサイズ 512 メガバイトを宣言します。このグループに属するサーバーは、この設定を継承します。グループ全体、ホスト、または個々のサーバーの設定を変更できます。

例14.2 ホスト設定ファイルのドメイン設定

以下の例は、host.xml 設定ファイルのサーバーグループの JVM 宣言を示しています。
<servers>
  <server name="server-one" group="main-server-group" auto-start="true">
    <jvm name="default"/>
  </server>
  <server name="server-two" group="main-server-group" auto-start="true">
    <jvm name="default">
      <heap size="64m" max-size="256m"/>
    </jvm>
    <socket-bindings port-offset="150"/>
  </server>
  <server name="server-three" group="other-server-group" auto-start="false">
    <socket-bindings port-offset="250"/>
  </server>
</servers>
この場合、server-two という名前のサーバーは main-server-group という名前のサーバーグループに属し、default JVM グループから JVM 設定を継承します。上記の例では、main-server-group のメインヒープサイズは 512 メガバイトに設定されています。最大ヒープサイズ 256 メガバイトを宣言すると、server-twodomain.xml 設定を上書きし、必要に応じてパフォーマンスを微調整できます。

実行時のスタンドアロンサーバー設定

スタンドアロンサーバーインスタンスの JVM 設定は、サーバーを起動する前に JAVA_OPTS 環境変数を設定することでランタイム時に宣言できます。Linux コマンドラインで JAVA_OPTS 環境変数を設定する例は次のとおりです。

[user@host bin]$ export JAVA_OPTS="-Xmx1024M"
次のように、同じ設定を Microsoft Windows 環境で使用できます。
C:\> set JAVA_OPTS="Xmx1024M"
または、JVM に渡すオプションの例が含まれる EAP_HOME/bin フォルダーにある standalone.conf ファイルに JVM 設定を追加することもできます。
警告
JAVA_OPTS 環境変数を設定すると、JAVA_OPTS 環境変数のデフォルト値が再定義されます。これにより、JBoss EAP の起動が中断または中断される可能性があります。

14.1.2. 管理コンソールでの JVM 状態の表示

スタンドアロンサーバーまたは管理対象ドメインの管理コンソールに Java 仮想マシン(JVM)ステータスを表示できます。コンソールは、サーバーのヒープ使用量、非ヒープ使用、およびスレッドの使用状況を表示します。統計はリアルタイムでは表示されませんが、コンソール表示を更新して JVM リソースの最新の概要を提供できます。
JVM の状態には次の値が表示されます。
表14.1 JVM 状態属性
タイプ 説明
Max メモリー管理に使用できるメモリーの最大量。最大エバラブメモリーは、軽量グレイのバーで表示されます。
Used 使用されたメモリーの量。使用中のメモリー容量は、ダクグレーのバーで表示されます。
Committed Java 仮想マシンが使用するために確保されるメモリー量。コミットされたメモリーは dark grey バーで表示されます。

手順14.1 管理コンソールでの JVM 状態の表示

    • スタンドアロンサーバーインスタンスの JVM 状態 の表示

      画面の上部にある Runtime タブを選択します。Status メニューを展開し、Platform メニューを展開します。JVM を選択します。
    • 管理対象ドメインの JVM 状態の表示

      画面の上部にある Runtime タブを選択します。Server Status メニューを展開し、Platform メニューを展開します。JVM を選択します。
  1. 管理対象ドメインはサーバーグループのすべてのサーバーインスタンスを表示できますが、サーバーメニューから選択すると一度に 1 つのサーバーのみを表示できます。サーバーグループ内の他のサーバーの状態を表示するには、画面の左側にある Server の変更 をクリックして、グループに表示されるホストおよびサーバーから選択します。必要なサーバーまたはホストを選択し、JVM の詳細が変更されます。Close をクリックして終了します。

結果

サーバーインスタンスに対する JVM 設定の状態が表示されます。

14.1.3. JVM の設定

<jvm></jvm> タグは、<option value="VALUE"/> タグを使用して JVM 設定にパラメーターを追加するために使用できる <jvm-options></jvm-options> の使用をサポートします。

例14.3 <jvm-options> の使用

<jvm name="default">
  <heap size="1303m" max-size="1303m"/>
  <permgen max-size="256m"/>
  <jvm-options>
    <option value="-XX:+UseCompressedOops"/>
  </jvm-options>
</jvm>

CLI を使用した JVM の設定

CLI を使用して JVM を設定するには、以下の構文を使用します。

# cd /server-group=main-server-group/jvm=default

# :add-jvm-option(jvm-option="-XX:+UseCompressedOops")
{
    "outcome" => "success",
    "result" => undefined,
    "server-groups" => {"main-server-group" => {"host" => {"master" => {
        "server-one" => {"response" => {
            "outcome" => "success",
            "response-headers" => {
                "operation-requires-restart" => true,
                "process-state" => "restart-required"
            }
        }},
        "server-two" => {"response" => {
            "outcome" => "success",
            "response-headers" => {
                "operation-requires-restart" => true,
                "process-state" => "restart-required"
            }
        }}
    }}}}
}

# :read-resource

# Expected Result:

[domain@localhost:9999 jvm=default] :read-resource                                      
  {
    "outcome" => "success",
    "result" => {
    "agent-lib" => undefined,
    "agent-path" => undefined,
    "env-classpath-ignored" => undefined,
    "environment-variables" => undefined,
    "heap-size" => "1303m",
    "java-agent" => undefined,
    "java-home" => undefined,
    "jvm-options" => ["-XX:+UseCompressedOops"],
    "max-heap-size" => "1303m",
    "max-permgen-size" => "256m",
    "permgen-size" => undefined,
    "stack-size" => undefined,
    "type" => undefined
  }
}

jvm-options エントリーの削除

jvm-options エントリーを削除するには、次の構文を使用します。

# cd /server-group=main-server-group/jvm=default

# :remove-jvm-option(jvm-option="-XX:+UseCompressedOops")

# Expected Result:

[domain@localhost:9999 jvm=default] :remove-jvm-option(jvm-option="-XX:+UseCompressedOops")
{
    "outcome" => "success",
    "result" => undefined,
    "server-groups" => {"main-server-group" => {"host" => {"master" => {
        "server-one" => {"response" => {
            "outcome" => "success",
            "response-headers" => {
                "operation-requires-restart" => true,
                "process-state" => "restart-required"
            }
        }},
        "server-two" => {"response" => {
            "outcome" => "success",
            "response-headers" => {
                "operation-requires-restart" => true,
                "process-state" => "restart-required"
            }
        }}
    }}}}
}

32 ビットまたは 64 ビットアーキテクチャーの指定

Hewlett-Packard HP-UX および Solaris などの一部の環境では、32 ビットまたは 64 ビット JVM で実行されるかどうかを指定するために -d32 または -d64 スイッチが使用されます。指定がない場合はデフォルトで 32 ビットが使用されます。

手順14.2 スタンドアロンサーバーでの 64 ビットアーキテクチャーの指定

  1. EAP_HOME/bin/standalone.conf ファイルを開きます。
  2. 以下の行を追加して、-d64 オプションを JAVA_OPTS に追加します。
    JAVA_OPTS="$JAVA_OPTS -d64"

手順14.3 管理対象ドメインでの 64 ビットアーキテクチャーの指定

管理対象ドメインで実行している場合は、サーバーインスタンスの他にホストとプロセスコントローラーの 64 ビット環境を指定できます。
  1. 64 ビット JVM で実行するよう、ホストおよびプロセスコントローラーを設定します。
    1. EAP_HOME/bin/domain.conf ファイルを開きます。
    2. 以下の行を追加して、-d64 オプションを JAVA_OPTS に追加します。PROCESS_CONTROLLER_JAVA_OPTS および HOST_CONTROLLER_JAVA_OPTS が設定される前に挿入されていることを確認します。
      JAVA_OPTS="$JAVA_OPTS -d64"

      例14.4 domain.confの JVM オプション

      #  
      # Specify options to pass to the Java VM.  
      #  
      if [ "x$JAVA_OPTS" = "x" ]; then  
        JAVA_OPTS="-Xms64m -Xmx512m -XX:MaxPermSize=256m -Djava.net.preferIPv4Stack=true"  
        JAVA_OPTS="$JAVA_OPTS -Djboss.modules.system.pkgs=$JBOSS_MODULES_SYSTEM_PKGS -Djava.awt.headless=true"  
        JAVA_OPTS="$JAVA_OPTS -Djboss.modules.policy-permissions=true"  
        JAVA_OPTS="$JAVA_OPTS -d64"  
      else  
        echo "JAVA_OPTS already set in environment; overriding default settings with values: $JAVA_OPTS"  
      fi
  2. 64 ビット JVM で実行するよう、サーバーインスタンスを設定します。
    1. 適切な host.xml 設定ファイルに -d64 を JVM オプションとして追加します。

      例14.5 host.xmlの JVM オプション

      <jvms>  
        <jvm name="default">  
          <heap size="64m" max-size="256m"/>  
          <permgen size="256m" max-size="256m"/>  
          <jvm-options>  
            <option value="-server"/>  
            <option value="-d64"/>  
          </jvm-options>  
        </jvm>  
      </jvms>
      注記
      管理 CLI では以下のコマンドで、適切なホストに -d64 オプションを追加できます。
      /host=HOST_NAME/jvm=default:add-jvm-option(jvm-option="-d64")

14.1.4. Java Security Manager について

Java Security Manager は、Java Virtual Machine (JVM) サンドボックスの外部境界を管理するクラスで、JVM 内で実行されるコードが JVM 外のリソースと対話する方法を制御します。Java Security Manager を有効にすると、Java API はさまざまな潜在的に危険な操作を実行する前に、セキュリティーマネージャーで承認を確認します。Java Security Manager はセキュリティーポリシーを使用して、特定のアクションが許可または拒否されるかどうかを判断します。

14.1.5. Java セキュリティーポリシー

Java Security ポリシーは、さまざまなクラスのコードに対する定義されたパーミッションのセットです。Java Security Manager は、アプリケーションによって要求されたアクションをセキュリティーポリシーと比較します。ポリシーがアクションを許可した場合、Security Manager はそのアクションの実行を許可します。ポリシーによりアクションが許可されない場合、セキュリティーマネージャーはそのアクションを拒否します。セキュリティーポリシーは、コードの場所、コードの署名、またはサブジェクトのプリンシパルに基づいてパーミッションを定義できます。
セキュリティーポリシー付与エントリーは、以下の設定要素で構成されます。
CodeBase
コードの起点となる URL の場所(ホストとドメイン情報を除く)。このパラメーターは任意です。
SignedBy
コードの署名に秘密鍵が使用された署名者を参照するキーストアで使用されるエイリアス。これは、単一の値またはコンマ区切りの値のリストになります。このパラメーターは任意です。省略した場合には、署名の有無に関わらず、Java Security Manager には影響がありません。
Principal
実行中のスレッドのプリンシパルセットに存在する必要がある principal_type/principal_name ペアの一覧。Principals エントリーは任意です。これを省略すると、実行中のスレッドのプリンシパルが Java Security Manager には影響しません。
Permissions
パーミッションは、コードに付与されるアクセスです。多くのパーミッションは、Java Enterprise Edition 6(Java EE 6)仕様の一部として提供されます。

14.1.6. Java セキュリティーポリシーの作成

ほとんどの JDK および JRE ディストリビューションに policytool と呼ばれるアプリケーションが含まれており、Java セキュリティーポリシーを作成および編集することを目的としています。policytool に関する詳細情報は、にリンクされてい http://docs.oracle.com/javase/6/docs/technotes/tools/ ます。テキストエディターを使用してセキュリティーポリシーを作成することもできます。

手順14.4 新しい Java Security Manager ポリシーの設定

  1. policytool を起動します。

    policytool ツールを以下のいずれかの方法で起動します。
    • Red Hat Enterprise Linux

      GUI またはコマンドプロンプトで、/usr/bin/policytool を実行します。
    • Microsoft Windows Server

      Start メニューまたは Java インストールの bin\ から policytool.exe を実行します。ロケーションは異なる場合があります。
  2. ポリシーを作成します。

    ポリシーを作成するには、Add Policy Entry を選択します。必要なパラメーターを追加してから、完了 をクリック ます。
    注記
    VFS を使用して、JBoss EAP にデプロイされたアプリケーションのパスを指定します。Linux では、パスは vfs:/content/application.war になります。Microsoft Windows では、vfs:/${user.dir}/content/application.war です。
    以下に例を示します。
    grant codeBase "vfs:/content/application.war/-" {
    permission java.util.PropertyPermission "*", "read";
    };
    
  3. 既存のポリシーを編集します。

    既存のポリシーの一覧からポリシーを選択し、Edit Policy Entry ボタンを選択します。必要に応じてパラメーターを編集します。
  4. 既存のポリシーを削除します。

    既存のポリシーの一覧からポリシーを選択し、Remove Policy Entry ボタンを選択します。

14.1.7. Java Security Manager 内での JBoss EAP 6 の実行

JBoss EAP 6.4 以降、Java Security Manager(JSM)内で JBoss EAP 6 を実行すると、secmgr オプションを使用します。
重要
-Djava.security.manager Java システムプロパティーの直接使用ができなくなりました。以前の JBoss EAP 6 で Java Security Manager を有効にするために使用されていたこの方法は、JBoss EAP 起動スクリプトのフォールバックメカニズムとしてのみサポートされています。
注記
JBoss EAP 6.4 以降では、カスタムセキュリティーマネージャーは使用できません。
以下の手順では、指定のセキュリティーポリシーを使用して Java Security Manager 内で実行するように JBoss EAP 6 インスタンスを設定する手順を説明します。

前提条件

  • この手順を実行する前に、Java Development Kit(JDK)または Java SE Runtime Environment(JRE)に含まれる policytool アプリケーションを使用してセキュリティーポリシーを記述する必要があります。テキストエディターを使用してセキュリティーポリシーを作成することもできます。
    パーミッションが必要なユーザーデプロイメントには、セキュリティーポリシーが必要です。この手順では、ポリシーが EAP_HOME/bin/server.policy にあることを前提としています。
  • 設定ファイルを編集する前に、ドメインまたはスタンドアロンサーバーを完全に停止する必要があります。
管理対象ドメインで JBoss EAP 6 を使用している場合は、ドメインの各物理ホストまたはインスタンスで以下の手順を実行する必要があります。

手順14.5 JBoss EAP 6 の Java Security Manager の設定

  1. 設定ファイルを開く

    設定ファイルを開いて編集します。編集が必要な設定ファイルは、管理対象ドメインまたはスタンドアロンサーバーとオペレーティングシステムのどちらを使用するかによって異なります。
    • 管理対象ドメイン

      • For Linux: EAP_HOME/bin/domain.conf
      • Windows の場合: EAP_HOME\bin\domain.conf.bat
    • スタンドアロンサーバー

      • For Linux: EAP_HOME/bin/standalone.conf
      • Windows の場合: EAP_HOME\bin\standalone.conf.bat
  2. Java Security Manager の有効化

    以下のいずれかの方法を使用して Java Security Manager を有効にします。
    • JBoss EAP 6 のサーバー起動スクリプトで -secmgr オプションを使用します。
    • 設定ファイルの secmgr="true" 行のコメントを解除します。
      • Linux の場合:

        # Uncomment this to run with a security manager enabled
        SECMGR="true"
      • Windows の場合:

        rem # Uncomment this to run with a security manager enabled
        set "SECMGR=true"
  3. Java セキュリティーポリシーの指定

    -Djava.security.policy を使用して、セキュリティーポリシーの場所を指定できます。これは、改行なしで 1 行のみに置く必要があります。-Djava.security.policy を設定する場合は == を使用すると、セキュリティーマネージャーは指定されたポリシーファイル のみ を使用するように指定します。= を使用すると、セキュリティーマネージャーは JAVA_HOME/jre/lib/security/java.securitypolicy.url セクションに設定されたポリシー と組み合わせ て指定されたポリシーを使用するように指定します。
    関連する JBoss EAP 6 設定ファイルでセキュリティーポリシー Java オプションを追加します。管理対象ドメインを使用している場合は、PROCESS_CONTROLLER_JAVA_OPTS および HOST_CONTROLLER_JAVA_OPTS が設定される前に挿入されていることを確認します。
    • Linux の場合:

      JAVA_OPTS="$JAVA_OPTS -Djava.security.policy==EAP_HOME/bin/server.policy -Djboss.home.dir=EAP_HOME"
    • Windows の場合:

      set "JAVA_OPTS=%JAVA_OPTS% -Djava.security.policy==EAP_HOME\bin\server.policy -Djboss.home.dir=EAP_HOME"
  4. ドメインまたはサーバーの起動

    ドメインまたはサーバーを通常どおり起動します。

14.1.8. IBM JDK および Java Security Manager

IBM JDK のバージョンによっては、JBoss EAP セキュリティーポリシーと適切に動作しないデフォルトのポリシープロバイダーを使用します。IBM JDK を使用して Java Security Manager を有効にして JBoss EAP をホストする際に問題が発生した場合は、JRE 設定を変更して標準のポリシープロバイダーを使用する必要があります。
IBM JDK の JRE 設定を変更するには、JAVA_HOME/jre/lib/security/java.security ファイルを編集し、policy.provider の値を sun.security.provider.PolicyFile に設定します。
policy.provider=sun.security.provider.PolicyFile

14.1.9. Security Manager ポリシーのデバッグ

デバッグ情報を有効にして、セキュリティーポリシー関連の問題のトラブルシューティングに役立ちます。java.security.debug オプションは、報告されたセキュリティー関連情報のレベルを設定します。java -Djava.security.debug=help コマンドは、デバッグオプションの全範囲でヘルプ出力を生成します。デバッグレベルを all に設定すると、原因が完全に不明ですが、一般的に使用する場合に、情報が過剰に生成されるセキュリティー関連の障害をトラブルシューティングするのに便利です。適切な一般的なデフォルトは access:failure です。

手順14.6 一般的なデバッグの有効化

  • この手順を実行すると、セキュリティー関連デバッグ情報の一般的な機密レベルを有効にすることができます。

    次の行をサーバー設定ファイルに追加します。
    • JBoss EAP 6 インスタンスが管理対象ドメインで実行されている場合は、Linux の場合は bin/domain.conf ファイル、Windows の場合は bin\domain.conf.bat ファイルに追加されます。
    • JBoss EAP 6 インスタンスがスタンドアロンサーバーとして実行されている場合、行は Linux の場合は bin/standalone.conf ファイル、Windows の場合は bin\standalone.conf.bat ファイルに追加されます。
Linux
JAVA_OPTS="$JAVA_OPTS -Djava.security.debug=access:failure"
Windows
set "JAVA_OPTS=%JAVA_OPTS% -Djava.security.debug=access:failure"

結果

セキュリティー関連デバッグ情報の一般的なレベルが有効になります。

Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.