この記事は Java Advent Calendar 15 日目です!
14日目は @megascus さんの
動的SQLでPreparedStatement+プレースホルダを使用する - 水まんじゅう でした。
明日は @cero_t さんです。
まえがき
いよいよ JDK 8 が来年の3月に正式リリースされます。素晴らしいことに Java Japan User Group の皆様の blog や記事、 JJUG Night、CCC などの勉強会やカンファレンスなど、JDK 8 の新機能が紹介されている場が多いので、既にある程度知っている人も多いのではないでしょうか。しかし、JDK 8 全体としてどのような機能が加わるのか、それを把握する方法がよく解らない人もいらっしゃると思います。ここではどうすれば JDK 8 の新機能を確認できるのか、そして新機能はどう言ったものがあるのか簡単なダイジェストを紹介します。
なお、JDK 8 から導入されるクラスやメソッドは何かという観点での変更点確認は torutk さんの記事に纏まっていますので、そちらを参考に!
JDK Enhancement Proposal
Java 関連の周辺技術標準化は JCP(Java Community Process) によって行われ、新しい技術仕様や改訂仕様(既存技術仕様の改訂)は JSR (Java Specification Request) として提案され、標準化に関する作業が管理されます。
では、JSR を追って行けば JDK の新機能が解るのか?実はそれは違っていて、JDK で何かしらの新機能を加える場合、その内容は JEP (JDK Enhancement-Proposal) として管理されています。JDK 8 の機能部分は、Oracle 社独自の変更(解りやすい例としてFlight Recorder周り)以外の変更点は、OpenJDK 8 プロジェクトの Features から確認できます。今回はこの JEP についてダイジェストをまとめてみました。
JDK 8 Features ダイジェスト
と言うわけでダイジェストです。
126 Lambda Expressions & Virtual Extension Methods
JDK8 の目玉の一つ、Lambda。@bitter_fox さんが素晴らしい発表をJJUG CCC 2013 Fallでされたのでそちらを確認しましょう。
138 Autoconf-Based Build System
ビルドシステムの簡素化&並列化を目指して autoconf (./configure style) ビルドセットアップの導入、Makefileのリファクタなど。エンドユーザ(※ここではJava言語を使ってコード書く人)は関係なし。JVMをビルドする人は楽になる(かも)。
個人的にはビルドシステムの改善はどこのプロジェクトでも課題になりやすい感がありますね。
160 Lambda-Form Representation for Method Handles
Lambda関係。メソッドハンドル / invokedynamic の改善。JSR 292の延長。
161 Compact Profiles
Profileの導入。リソースが制限されたデバイスでも動作するように各用途に応じたプロファイルを準備できるようにする。
これは Java ME との統合の一環(JDK8からJava SEとJava MEの統合が目指されている)の拡張。
162 Prepare for Modularization
Project Jigsaw (モジュール化) の前準備。Jigsaw は 元々 JDK 8 からの予定だったが、JDK 9 にずれ込んだ。
164 Leverage CPU Instructions for AES Cryptography
174 Nashorn JavaScript Engine
Nashorn. Rhino 後継の JVM ベースの JavaScript 実装。
176 Mechanical Checking of Caller-Sensitive Methods
セキュリティ関連。エンドユーザは余り関係なし。
142 Reduce Cache Contention on Specified Fields
マルチスレッドアプリにおけるキャッシング改善。JVMレイヤの変更で、アプリレイヤは無関係(影響なし)。
122 Remove the Permanent Generation
パーマメント領域の削除。ヒープ領域への統合。
以下、このJEPのソースコードからの確認内容。
PermGenがなくなったので、クラスのアンロードはクラスローダのライフサイクル(破棄)と同期するようになる。
他、UseCompressedKlassPointers が true の場合(追記:デフォルトは環境依存)は、ClassMetaspaceSize(デフォルト100M。指定する場合はKlassEncodingMetaspaceMax以下にしないとUseCompressedKlassPointersが false になる)のMetaspaceを作成する。ここら辺の各種オプション等は、GA 出てから再確認してから別途掲載します。
ソースコード等の情報は以下のように取得する。
173 Retire Some Rarely-Used GC Combinations
テストやメンテナンスコスト削減のため、滅多に使われてない GC 組み合わせを削除。
具体的には
- -XX:-UseParNewGC -XX:+UseConcMarkSweepGC
- -XX:+UseParNewGC
- -Xincgc / -XX:+CMSIncrementalMode
を実行した場合、警告が出力される。
136 Enhanced Verification Errors
JVM's bytecode verifier の拡張。(VerifyError)
148 Small VM
3mb以下のvm作成をサポート。JavaME統合との一貫。
171 Fence Intrinsics
メモリフェンスintrinsics。エンドユーザには影響なし。省略。
103 Parallel Array Sorting
java.util.Arrays に配列をパラレルにソートするメソッド(parallelSort)を追加。JSR 166 (Fork/Join) 関連。
107 Bulk Data Operations for Collections
Lambda関連。ざっくり言うと「filter/map/reduce for Java」
109 Enhance Core Libraries with Lambda
Lambda。
112 Charset Implementation Improvements
Charsetの改善。目的はメンテナンス性と性能。
119 javax.lang.model Implementation Backed by Core Reflection
コアリフレクションによるjavax.lang.model実装(読んで字のごとく)。
149 Reduce Core-Library Memory Usage
性能に問題を与えない範囲でのコアライブラリによるメモリ消費量の削減。
150 Date & Time API
新たな日付APIの提供。詳細は kis さんの記事が参考になります。また、このAPIの象徴的なツイートは以下の通り。
Java Date Time API 橋本さん「既存Dateクラスとの相互変換が難しいのはなぜですか」 蓮沼さん「意図的にやってます。スペックリードのステファンが、Dateをぶっころすという気持ちでやってます」 橋本さん「確かに殺意を感じます」 #jjug_ccc
— きしだﬗ (@kis) 2013, 11月 9
155 Concurrency Updates
JavaSE5から導入された並行処理用のAPI(java.util.concurrent)の更新。要点は次の三つ。
- スケーラブルに更新可能な変数(Adder(DoubleAdder、LongAdder等)、Accumulator(DoubleAccumulator、LongAccumulator等))の追加
- ConcurrentHashMap に対するキャッシュ指向の機能拡張(メモリ消費削減、シーケンシャル・並行処理のサポート)
- ForkJoinPool の改良(パフォーマンス改善など)
177 Optimize java.text.DecimalFormat.format
DemicalFormatの最適化。ゴールは2倍の速度改善らしい(micro-benchmark)。
178 Statically-Linked JNI Libraries
statically linked native librariesのサポート(JNI)
180 Handle Frequent HashMap Collisions with Balanced Trees
java.util.HashMap のパフォーマンス改善。バランス木による頻繁な HashMap 衝突のハンドリングによって改善を図る。
185 JAXP 1.5: Restrict Fetching of External Resources
JAXP 1.5の更新。メインは外部リソース取得の制限。
core/lang 関連の JEP
core/sec 関連のJEP
セキュリティ関する以下の機能がサポートされました。新たにサポートされた暗号化方式は何かを知りたい場合は、JEP 115: AEAD CipherSuites を確認しましょう。
- 113 MS-SFU Kerberos 5 Extensions
- 114 TLS Server Name Indication (SNI) Extension
- 115 AEAD CipherSuites
- 121 Stronger Algorithms for Password-Based Encryption
- 123 Configurable Secure Random-Number Generation
- 124 Enhance the Certificate Revocation-Checking API
- 129 NSA Suite B Cryptographic Algorithms
- 130 SHA-224 Message Digests
- 131 PKCS#11 Crypto Provider for 64-bit Windows
- 140 Limited doPrivileged
- 166 Overhaul JKS-JCEKS-PKCS12 Keystores
まとめ
以上、JDK 8 新機能のダイジェストでした!いかがでしたでしょうか、意外にこんな機能も追加されていたんだなーとか何かの気付きになれたら幸いです。
個人的には「 JEP 122: Remove the Permanent Generation 」と「 JEP 155: Concurrency Updates 」はその内もっと掘り下げていくことになりそうです。