読者です 読者をやめる 読者になる 読者になる

見習いプログラミング日記

Java EE を中心に色々なことを考えてみます。目指せ本物のプログラマ。

JavaOne2013レポート 9/24 (3日目)

3日目は Java SE と Java EE のセッションに参加。Java SE のセッションは理解できなかったのも多いので、レポートというよりは備忘録。

Developers’ Introduction to HotSpot Internals [CON6446]

セッションのテーマはJava仮想マシン入門について。Java仮想マシン仕様本に書かれているような、クラスロードの仕組みやConstant-Pool、invokespecialなどの代表的なニーモニックの紹介が行われた。セッションの最初には『javap使ったことあるかい?』のかけ声も。

  • クラスローディングの順序
    • Loading(ロード) -> Verification(検証) -> Linking(リンク) -> Initialize(staticイニシャライザ起動) の順番
    • ロードもリンクも必要になったらやる(Lazy)。実行時にNoClassDefFoundErrorになるのは遅延リンクが行われているから
  • 代表的な仮想マシン命令の紹介
    • オブジェクトの生成は new 命令。その後のコンストラクタの実行がinvokespecial。
    • フィールド操作はgetfield/putfield/getstatic/putstaticで行う。それぞれConstantPoolに登録された変数名と連携
    • 同期化について。monitorenterとmoniterexit命令でsynchronizedキーワードを実現
  • Java仮想マシンの基本的な動作
    • フェッチ、次のコードを実行、またフェッチ... 、tryみたいな複雑な制御文も全てスタック構造で実行

この他、インタフェースの実行であるinvokeinterfaceと普通のメソッド起動であるInvokeVirtialの違いなどが紹介されたが、うまく理解できず。帰ったら仮想マシン仕様を読まなければ。

GCについても少々説明が行われ、HotSpotにおけるGCのルートは『スレッドスタック』『static変数』『JNIハンドル』『modified area』の4つ。ローカル変数が入ってるスレッドスタックと、static変数は理解できたが、JNIハンドル、modified areaの正体が理解できず。

Lambda: A Peek Under the Hood [CON7941]

ラムダのバイトコードの仕組みが生まれるまでの経緯がテーマ。

導入は少しだけラムダ入門の話。ラムダ式は匿名クラスの実装を楽に実装する手段であり、かつ何故ラムダがJavaに必要だったか(並列性の向上)など、ラムダの話で必ず出てくる内容。

次にラムダ式の型は何か?について。Predicateインタフェースなどの@FunctionalInterfaceが付けられたインタフェースがラムダ式の型の正体。この話はLamda FAQでも言及されており、ここまでは付いていけた。

ここから先は、ラムダ式を毎回関数インタフェース型に変換していては効率が悪い、ラムダ式を内部クラスとして扱うのもラムダ式ごとにクラス数が増えて効率が悪い、Java SE 7 から導入されたMethodHandleという手段もあるが、やはり効率が悪いなど、キーワードレベルしか理解できず。最終的に現在のLambdaMetaFactoryクラスでラムダ式を示すクラスを動的に生成してinvokedynamic命令で実行することになった。

invokedynamic命令によるラムダ式の実行についてはJJUGナイトセミナーにおいて、宮川さんがラムダとinvokedynamicの蜜月として紹介していたので、まずはこの内容から振り返ろうと思う。

Nuts and Bolts of Java EE 7 Interceptors [CON7771]

テーマはJava EE 7 でメンテナンスされたInterceptor1.2仕様の紹介と、Interceptor仕様と他仕様の連携について。

Interceptor1.2の変更点についてはYoutubeSparky GlassFishで紹介されてる内容が参考になると思う。

Interceptor1.2 の変更点

  • CDI/EJB仕様書とのカバー範囲の整理
  • コンストラクタへのインターセプタ AroundConstruct の導入
  • @Priorityによるインターセプタ実行順序の制御

@Priorityは嬉しい。CDI1.0では、CDIのインターセプタを使うためにはbean.xmlにインターセプタ実行順序を定義しなければいけなかったが、@PriorityによってXMLを書く必要がなくなった。

インターセプタは当初 Java EE 5 に@Interceptorsアノテーションが導入され、EJBに対してインターセプトできたが、Java EE 6ではCDI仕様でも@InterceptorBindingでCDI Beanに対してインターセプタが実現できていたため、仕様が重複したりわかりにくい部分もあった。このため、Intreceptor1.2では整理が行われた。例えば、インターセプタに関する仕様をCDI仕様からInterceptor1.2仕様に移したり、逆にejb-jar.xmlにインタセプターを定義できる仕様はInterceptor1.1からEJB仕様に移されるなど、仕様間の連携を強化した整理が行われた。

Java EE の各仕様間の連携は仕様書のカバー範囲だけでなく、機能の連携にも及んでいる。

例えば、CDIトランザクションが実現できる@TransactinalにはCDIの機能である@InterceptorBindingが使われていたり、BeanValidation1.1のMethodバリデータにはInterceptor1.2から導入されたコンストラクタへのインターセプタAcountConstructの仕組みが使われていたりする。

Java EE 6 から仕様間で機能の重複が増えたことによる混乱があったが、確実に整理が始まっていることを感じた。

Fifty New Features of Java EE 7 in 50 Minutes [CON4510]

テーマはタイトルの通り、Java EE 7 の50個の新機能を50分で説明するセッション。日本でもおなじみのOracleエバンジェリストArun Guptaさんと、金魚本の著者であるAntonio Goncalvesさんが登壇した。

紹介されたNewFeatures

CDI1.1

  • CDIのbean-discovery-modeの導入について
  • @Ventedの導入

BeanValidation1.1

  • Method単位のバリデーション導入

Interceptor1.2

  • @AroundConstruct の導入
  • @Priority の導入

Concurrency Utilities 1.0

  • Managed Executorの導入
  • Managed Schedule Timerの導入
  • Managed Thread Factory
  • Dynamic Proxy

その他、たくさんあるので後日追記予定。

途中Q&Aにより時間が押したため『JCAはいいや』と1つだけAntonioさんがスキップする以外は、見事に時間内に完走。あまり大きくない変更で、かゆい所に手が届くと言われた Java EE 7 も、全て紹介するとボリュームの多さを感じたセッションでした。

Meet the Java EE Specification Leads [BOF2795]

  • ずらっと並んだ Java EE スペックリードの方々とのQ&Aと中心としたBOF。Java EE 8 の検討テーマのキーワードもちらほらと。スライドはこちらで公開中。内容に関するメモは後日追記予定。