web-dev-qa-db-ja.com

Java 10のアプリケーションクラスデータ共有機能の使用方法

OracleドキュメントでCDSについて読みます https://docs.Oracle.com/javase/8/docs/technotes/guides/vm/class-data-sharing.html

私が理解したのは、jvmのロードに必要なシステムクラスファイルが解析され、検証されて、jre/lib/[Arch] /client/classes.jsaにあるアーカイブに格納されていることです。さらに、jvmのメモリマッピングも提供しているため、jvmはアーカイブで指定されたマッピング情報に従ってメモリを直接マップします。したがって、これにより、jvmインスタンスが起動するたびにクラスをロードするオーバーヘッドが減少します。間違っていたら訂正してください。

Java 10に来ると、アプリケーションコードでこれをどのように実現できますか?次に、完全なアプリケーションコードがCDSの対象になるか、またはいくつかの制限がありますか?

16
Shubham Kadlag

アプリケーションクラスデータを使用してアーカイブを作成および使用するには、3つの重要な手順があります(詳細については、 アプリケーションクラスデータの共有に関する私の投稿 を参照してください)。

  1. アーカイブに含めるクラスのリストを作成します。

    _Java -XX:+UseAppCDS
        -XX:DumpLoadedClassList=classes.lst
        -jar app.jar
    _
  2. アーカイブを作成する:

    _Java -XX:+UseAppCDS -Xshare:dump 
        -XX:SharedClassListFile=classes.lst
        -XX:SharedArchiveFile=app-cds.jsa
        --class-path app.jar
    _
  3. アーカイブの使用:

    _Java -XX:+UseAppCDS -Xshare:on 
        -XX:SharedArchiveFile=app-cds.jsa
        -jar app.jar
    _

次の点に注意してください。

  • アーカイブの作成時にクラスパスにワイルドカードや展開されたJARを使用することはできません
  • アプリケーションの起動に使用されるクラスパスには、アーカイブの作成に使用されるクラスパスがプレフィックスとして含まれている必要があります
  • 問題がある場合は、_-Xlog:class+load_( _-Xlog_ の詳細)を使用して詳細情報を取得します
12
Nicolai

[〜#〜] jep [〜#〜] のAppCDSの例では、アプリケーションクラスを共有アーカイブに追加する方法を示しています。制限に関しては、いくつかあります:

  1. クラスパスのディレクトリにあるストレートクラス(.class)は、共有アーカイブに追加できません。これを見てください thread
  2. カスタムクラスローダーによって読み込まれたクラスは、共有アーカイブに追加できません。これを見てください thread

CDS/AppCDSを使用する際に注意すべきその他の実用的な考慮事項があります。

  1. ファイルシステムのjarファイルを更新する場合は、共有アーカイブを再作成する必要があります。
  2. 実行時にクラスファイルを変更/再変換/再定義するJavaまたはJVMTIエージェント)を使用している場合、クラスは次のようになるため、共有アーカイブは役に立ちません。エージェントが実際のクラスファイルデータを必要とするため、ディスクからロードされます。これは、共有アーカイブに格納されていないと思います。

CDSとAppCDSに関するもう1つの素敵で詳細な記事は https://simonis.github.io/cl4cds/ です。

この記事の著者は、カスタムクラスローダーによってアプリケーションクラスがロードされた場合でもアプリケーションクラスを共有できるようにする tool も作成しています。

CDSの使用に興味がある場合は、この機能を長期間備え、より成熟した完全なOpenJ9 JVMを試すこともできます。詳しくは こちら をご覧ください。

7
Ashutosh