トップ その他 IT用語 JVM

JVMとは―Java仮想マシン。役割やJREとの違い、JVM Profilerなど。

JVM(Java仮想マシン)とは何かをテーマに、役割やJREとの違い、JVM Profilerなどの情報をまとめています。

▲記事トップへ

目次

この記事の目次です。

1. JVMとは
2. JVMの役割
3. JREとの違い
4. JVMの動作
5. JVM 引数
6. JVM Profiler

更新履歴

1. JVMとは

JVMとは、Javaのアプリケーションの実行環境を提供するソフトウェアです。

Java Virtual Machineの略

JVMはJava Virtual Machineの略です。日本語でJava仮想マシンといいます。

2. JVMの役割

Java言語で開発されたソフトウェアは、 配布時にはプラットフォームから独立した独自の形式(Javaバイトコード)になっており、 これを実行するプラットフォーム固有の形式(ネイティブコード)に変換するソフトウェアを用意して、 変換しながら実行します。この変換と実行を行なうのがJVMです。

つまり、JVMをインストールすれば、 OSの違いを吸収してクラスファイルを実行してくれるので、 プラットフォームに依存しない、 いわゆるマルチプラットフォームを実現できるということです。

3. JREとの違い

Javaの実行環境はJREとよばれるパッケージでその一部にJVMがあります。

JREとは何か

JREは、Java Runtime Environmentの略でJavaの実行環境です。 Javaのプログラムを実行するために必要なソフトウェアのパッケージで、単体でパッケージとして配布されたり、JDKなどに含まれています。 JVMはこのJREに含まれるソフトウェアです。

JVMとJREの違い

JVMとJREの違いは、JREにはJVM以外にJavaのクラスライブラリなどが含まれる点です。

JVMとJREとJDKの位置づけ

4. JVMの動作

JVMは、クラスローダーでクラスファイルを読み込み、バイトコード検証を行って、実行エンジンがプログラムを実行します。

クラスファイルとJavaバイトコード

Javaプログラムは、.javaファイルでコーディングした後にJavaコンパイラを使用して、Javaバイトコードに変換してクラスファイル(.class)を生成します。

C言語などでは、コンパイラは特定のシステムのマシンコードを生成しますが、Javaコンパイラは、JVM用のコードであるJavaバイトコードを生成します。 JVMは、コンパイラがクラスファイルに生成したJavaバイトコードをプラットフォームのネイティブコードに変換して実行します。

JVMの動作イメージ

JVMの動作イメージは以下です。

JVMの動作イメージ

JVMの動作は、クラスローダーでクラスファイルを読み込み、バイトコード検証を行って、実行エンジンがプログラムを実行します。

5. JVM 引数

JVM 引数は、Javaコマンド実行時の引数で、JVM実行時に指定するオプションです。

JVM引数の標準オプション

JVM引数の標準オプションは、Javaコマンドの「-help」オプションで確認できます。

java -help
使用方法: java [-options] class [args...]
           (クラスを実行する場合)
   または  java [-options] -jar jarfile [args...]
           (jarファイルを実行する場合)
optionsには次のものがあります。
    -d32          使用可能な場合は32ビットのデータ・モデルを使用する
    -d64          使用可能な場合は64ビットのデータ・モデルを使用する
    -server       "server" VMを選択する場合
                  デフォルトVMはserverです.

    -cp <ディレクトリおよびzip/jarファイルのクラス検索パス>
    -classpath <ディレクトリおよびzip/jarファイルのクラス検索パス>
                  クラス・ファイルを検索するディレクトリ、
                  JARアーカイブおよびZIPアーカイブの;で区切られたリストです。
    -D<name>=<value>
                  システム・プロパティを設定する
    -verbose:[class|gc|jni]
                  詳細な出力を行う
    -version      製品バージョンを出力して終了する
    -version:<value>
                  警告: この機能は非推奨であり、詳細のリリースで
                  廃止されます。
                  指定したバージョンを実行に必須にする
    -showversion  製品バージョンを出力して続行する
    -jre-restrict-search | -no-jre-restrict-search
                  警告: この機能は非推奨であり、詳細のリリースで
                  廃止されます。
                  ユーザーのプライベートJREをバージョン検索に含める/除外する
    -? -help      このヘルプ・メッセージを出力する
    -X            非標準オプションに関するヘルプを出力する
    -ea[:<packagename>...|:<classname>]
    -enableassertions[:<packagename>...|:<classname>]
                  指定した粒度でアサーションを有効にする
    -da[:<packagename>...|:<classname>]
    -disableassertions[:<packagename>...|:<classname>]
                  指定した粒度でアサーションを無効にする
    -esa | -enablesystemassertions
                  システム・アサーションを有効にする
    -dsa | -disablesystemassertions
                  システム・アサーションを無効にする
    -agentlib:<libname>[=<options>]
                  ネイティブ・エージェント・ライブラリ<libname>をロードする。例: -agentlib:hprof
                  -agentlib:jdwp=helpと-agentlib:hprof=helpも参照
    -agentpath:<pathname>[=<options>]
                  フルパス名でネイティブ・エージェント・ライブラリをロードする
    -javaagent:<jarpath>[=<options>]
                  Javaプログラミング言語エージェントをロードする。java.lang.instrumentを参照
    -splash:<imagepath>
                  指定したイメージでスプラッシュ画面を表示する
詳細はhttp://www.oracle.com/technetwork/java/javase/documentation/index.htmlを参照してください。

JVM 引数の非標準オプション

JVM 引数の非標準オプションは、ヒープサイズの指定でおなじみの「-X」から始まるオプションです。 これはJavaコマンドの「-X」オプションで確認できます。

java -X
    -Xmixed           混合モードの実行(デフォルト)
    -Xint             インタプリタ・モードの実行のみ
    -Xbootclasspath:<;で区切られたディレクトリおよびzip/jarファイル>
                      ブートストラップのクラスとリソースの検索パスを設定する
    -Xbootclasspath/a:<;で区切られたディレクトリおよびzip/jarファイル>
                      ブートストラップ・クラス・パスの最後に追加する
    -Xbootclasspath/p:<;で区切られたディレクトリおよびzip/jarファイル>
                      ブートストラップ・クラス・パスの前に付加する
    -Xdiag            追加の診断メッセージを表示する
    -Xnoclassgc       クラスのガベージ・コレクションを無効にする
    -Xincgc           増分ガベージ・コレクションを有効にする
    -Xloggc:<file>    タイムスタンプが付いたファイルにGCステータスのログを記録する
    -Xbatch           バックグラウンドのコンパイルを無効にする
    -Xms<size>        Javaの初期ヒープ・サイズを設定する
    -Xmx<size>        Javaの最大ヒープ・サイズを設定する
    -Xss<size>        Javaのスレッド・スタック・サイズを設定する
    -Xprof            CPUプロファイル・データを出力する
    -Xfuture          将来のデフォルトを見越して、最も厳密なチェックを有効にする
    -Xrs              Java/VMによるOSシグナルの使用を削減する(ドキュメントを参照)
    -Xcheck:jni       JNI関数に対する追加のチェックを実行する
    -Xshare:off       共有クラスのデータを使用しようとしない
    -Xshare:auto      可能であれば共有クラスのデータを使用する(デフォルト)
    -Xshare:on        共有クラス・データの使用を必須にし、できなければ失敗する。
    -XshowSettings    すべての設定を表示して続行する
    -XshowSettings:all
                      すべての設定を表示して続行する
    -XshowSettings:vm すべてのVM関連の設定を表示して続行する
    -XshowSettings:properties
                      すべてのプロパティ設定を表示して続行する
    -XshowSettings:locale
                      すべてのロケール関連の設定を表示して続行する

-Xオプションは非標準なので、予告なく変更される場合があります。

-Xprofコマンドラインオプション

-Xprofコマンドラインオプションは、CPUプロファイル・データを出力します。

表示項目の見方

-Xrsコマンドラインオプション

-Xrsコマンドラインオプションは、Java VMによるオペレーティングシステムシグナルの使用を減らします。

-Xrsコマンドラインオプションの影響

-Xrsを指定した場合は、以下の影響があります。

JVMのシャットダウンフック機能と-Xrsコマンドラインオプション

Javaアプリケーションを正規の手順に従ってシャットダウンするためのシャットダウンフック機能ががあります。 この機能により、JVMが突然終了した場合でも、シャットダウン時にデータベース接続のクローズなどのユーザークリーンアップコードが実行できます。 JVMは、シグナルをキャッチすることによって、JVMの異常終了のためのシャットダウンフックを実装し、SIGHUP、SIGINT、および SIGTERM を使用して、シャットダウンフックの実行を開始します。

JVMは、デバッグ用のスレッドスタックをダンプする機能を実現するためにも、同様のメカニズムを使用します。 JVMは、スレッドダンプを実行するためにSIGQUITを使用します。

JVMを埋め込んでいるアプリケーションがSIGINTやSIGTERMなどのシグナルを頻繁にトラップする必要があると、JVMのシグナルハンドラの処理に支障が出る可能性があります。 -Xrsコマンドラインオプションを使用すると、SIGINT、SIGTERM、SIGHUP、およびSIGQUITに対するシグナルマスクは Java VMによって変更されず、これらのシグナルに対するシグナルハンドラはインストールされなくなります。

-XshowSettingsコマンドラインオプション

-XshowSettingsコマンドラインオプションは、すべての設定を表示して続行します。

-XshowSettings:カテゴリ

「-XshowSettings:カテゴリ」のようにして指定します。カテゴリの部分は以下の指定が行えます。

-XshowSettings:all

すべての設定を表示して続行します。

-XshowSettings:vm

すべてのVM関連の設定を表示して続行します。

-XshowSettings:properties

すべてのプロパティ設定を表示して続行します。

-XshowSettings:locale

すべてのロケール関連の設定を表示して続行します。

同時に-version引数を追加すると便利

-XshowSettingsはそのまま実行するとJavaのヘルプなども出力されて、VM関連の設定やプロパティ設定、ロケール関連など目的の情報が見にくくなってしまいます。 そこで以下のように-versionコマンドライン引数も追加すると、ヘルプ表示がバージョン表示に置き換わって見やすくなります。

java -XshowSettings:all -version

6. JVM Profiler

JVM Profilerは、Uberが開発した分散型のプロファイラです。 現在はオープンソースになっています。

更新履歴

この記事の更新履歴です。

戻る

スポンサーリンク

サイト内のページ

言語
C・C++ /HTML /Java /JavaScript /PHP /シェルスクリプト

開発環境
Ant /Burp /Eclipse /Fiddler /gcc /gdb /Git /g++ /JDK /JMeter /JUnit /Teraterm /ZAP

技術・仕様
Ajax /CORBA /Jakarta EE(旧称J2EE、Java EE) /JNI

ライブラリ/Framework/CMS
bootstrap /jQuery /FuelPHP /Lucene /MyBatis /Seasar2 /Spring /Struts /WordPress

Web API
Google Maps

ITインフラOSとミドルウェア
Linux /Windows /シェル
ActiveMQ /Tomcat /MariaDB /MySQL /Nagios /Redis /Solr

ITインフラサーバー
公開Webサーバー

ITインフラネットワーク
プログラミング /構築

ITインフラセキュリティ
公開サーバーのセキュリティ

PC製品
ZOTAC

SI
ホームページの作り方

その他
IT用語 /ITスキル体系

スポンサーリンク

関連サイト内検索ツール

zealseedsおよび関連サイト内のページが検索できます。

IPアドレス確認ツール

あなたのグローバルIPアドレスは以下です。

3.238.107.238

HTMLの表示色確認ツール

パスワード生成ツール

文字数のプルダウンを選択して、取得ボタンを押すと「a~z、A~Z、0~9」の文字を ランダムに組み合わせた文字列が表示されます。

ここに生成されます。

スポンサーリンク