torutkのブログ

ソフトウェア・エンジニアのブログ

Java読書会BOF「Java 11 and 12 New Features」(洋書)を読む会を開催して

Java 11 and 12 New Features」(洋書)を読む会を開催

昨日6月15日(土)に、Java読書会BOFは書籍「Java 11 and 12 - New Features」を読む会(第1回)を開催しました。

あいにくの雨模様でしたが、10名を超える参加者が集まりました。Javaの最新技術、といっても2年前の2017年にリリースされたJava SE9からの技術を解説した日本語の書籍が皆無で、洋書の選択となりました。

Java読書会BOFが開催する読書会では、書籍を本文、脚注、ソースコードとすべてを朗読して進めています。今回は洋書なので、どう進めようか?と思いましたが、英語のままで朗読して進めてみることとしました。

書籍の入手に関して

Amazonのサイトには、紙の書籍とKindle電子書籍版があり、紙版も2日程度で入手可能となっています。また、洋書の出版社Packt Publishingのサイトには、ePubおよびPDFの電子書籍版があります。Kindle版は2840円ですが、ePubおよびPDF版は10ドル(約1100円)と半額以下です。

英語の朗読について

英語の朗読なので、英語の得意な人は問題なく把握できますが、そうでないと分からない単語が多く読み取ることがなかなかむずかしいというところがありました。今回の本は割とやさしい英文でしたが、それでもちょっと苦労はあったようです。

少し時間がかかりますが、段落ごとに内容を日本語で簡単にまとめるといったフェーズをおくのがよかったかもしれません。

内容について

型推論

Java 10で導入された型推論(var)について、3時間はじっくりとかけて読みました。
ローカル変数のみ型をvarとして宣言可能で、未初期化、null代入、配列初期化子、配列の括弧とは一緒に定義できないという制約があります。また、varは予約語(キーワード)ではないので、メソッド名やインスタンス変数、static変数の識別子にvarの名前を使用可能です。

議論はありましたが、ローカル変数の宣言行でvarによる型推論を使うことでその宣言行を読んだだけでは型が分からない場合(例を次に示す)はvarによる型推論を使わない、というのが必須と思います。

var i = getData();

これは、getDataのメソッド名の宣言行(シグニチャ)を調べないと、ローカル変数iの型が分かりません。varを導入したことによりコードの読み手に対する情報が欠落してしまっています。

左辺の変数名、あるいは右辺のメソッド名から型が容易に推測できる場合はvarによる型推論を使ってもよいという意見もあります。しかし、個人的には、ローカル変数の宣言行で、型名を2回記述しなければならないときに型指定をvarとしてもよい、それ以外の場合は、型を書くというのをベストプラクティスにしたいです。

CDS(クラス・データ・シェアリング)

CDSは実はJava SE 5.0 から搭載されていた機能でしたが、まったく気にしたことがなく、使い方の記述を日本語では殆ど見かけたことがありませんでした。今回読書会では、JDKの標準クラスが格納されたclasses.jsaと、アプリケーションの起動時に必要なクラスをシェアリング用ファイルとして生成し使用するAppCDSとについて、じっくり読んで知識を得られました。

自宅のPC(Windows OS 64bit)にインストールしているJDKの各ディストリビューションとバージョンについてclasses.jsaの有無を見てみると、

  • Oracle JDK 8/9/10 ⇒ あり
  • Oracle OpenJDK 11/12 ⇒ あり
  • Liberica JDK 11 ⇒ なし
  • ZuluFX 11 ⇒ なし

となっていました。classes.jsaがない場合は、次のコマンドで生成することができます。

java -Xshare:dump 

Java SE 11以降では、CDSの使用可否を指定するJVMオプション -Xshare=auto がデフォルトとなりました。
[JDK-8197967] Make -Xshare:auto the default for server VM - Java Bug System

なので、Oracle JDK または Oracle OpenJDK の11以降を使う場合は明示的に指定しなくてもCDSが有効となります。Oracle以外のOpenJDKでclasses.jsaファイルがない場合は、そのOpenJDKのインストール直後に java -Xshare:dump を一度実行しておくとよいでしょう。

AppCDS(アプリケーション・クラス・データ・シェアリング)

CDSJavaの標準クラスをシェアする機構に対して、AppCDSはアプリケーションのクラスを含んだクラスをシェアする機構です。

オプションの指定がJava SE 11以降とJava SE 10とで変わるので少々混乱してしまいます。
次のJVMオプションはJava SE 11以降では廃止となって指定する必要はありません。

-XX:+UseAppCDS 

Java SE 11以降では、次のステップでAppCDSのシェアドアーカイブファイルを適用します。

  • 次のJVMオプションを指定してアプリケーションを実行、起動時にロードするクラス一覧のリストファイルを生成
 -Xshare:off -XX:DumpLoadedClassList=<リストファイル名>
  • 次のJVMオプションを指定してアプリケーションを実行、アプリケーションのクラスを含む起動時にロードするシェアドアーカイブファイルを生成
-Xshare:dump -XX:SharedClassListFile=<リストファイル名> -XX:SharedArchiveFile=<シェアドアーカイブファイル名> 
  • 以後、アプリケーションを実行するときは次のJVMオプションを指定
-XX:SharedArchiveFile=<シェアドアーカイブファイル名>

最初のステップで-Xshare:offを指定するのは、リストを作成するときに標準CDSアーカイブファイルから読み込むことを抑制するためと思われます。

次回の範囲は

次回は、次の項目を読み進める予定です。

  • Parallel full GC for G1
  • Miscellaneous Improvements in JDK 10
  • Local Variable Syntax of Lambda Parameters
  • Epsilon GC
  • The HTTP Client API