Appresso Engineer Blog

アプレッソのエンジニアが書く技術ブログです。

JavaOne 2016 2日目 (その2)

こんにちは、開発部の陳です。

同行している野口とは選んでいるセッション構成が少し違うので、 そのうちに印象の深いものを、2日目レポートの裏番組でお送りします。

Pick Diamonds from Garbage

セッション名の通り、ゴミ(GC ログ)からダイアモンド(有益な情報)をあさる方法を紹介するチュートリアルでした。

構成は順に、 KPI の説明、GC ログの読み方、ツールの紹介、Q&A になっています。

GC の KPI を説明するのに、 バカンスでサンフランシスコからハワイに行くのに、 戦闘機と旅客機どっちが適切かという面白い比較をしました。

  • Latency = 一人の乗客を運ぶのにかかる時間 / GC pause time
  • Throughput = すべての影響を考慮した上で、24時間で運べる乗客数 / useful works
  • Footprint = 一人の乗客を運ぶのにかかるコスト / CPU, memory

この例えは一見奇抜ですが、GC を広い意味でオブジェクトの移動として捉えれば、納得できます。

そのあと GC ログの読み方を紹介したが、

  • Java の実装ベンダー
  • JVM バージョン
  • GC アルゴリズム
  • 起動時引数

によって、形式だけでなく含まれている情報もかなり違うという無情な現実を突きつけられました。

さらにその現実の残酷さを実感するため、ここでこの曲を流しました…

最後に現実との戦いに生き残るため、いいツールを紹介してくれました。

gceasy.io

GC ログをアップロードすると、人が読みやすい形式テーブルやチャートに変換してくれるほか、 さらに統計情報や、GC の動きを分析して、可能な問題点を洗い出すという便利なツールです。 REST API も提供しているので、パフォーマンステストを含む CI に組み込むと幸せになるかもしれません。

blog.tier1app.com

Functional Data Structures With Java 8

Zeroturnaround の Oleg Šelajev さんが、Java 8 ベースの「関数型データ構造」を紹介するセッションでした。

コレクションを関数型の手法で実装するという素敵な試みで、 個人的(主に情報学的な観点)にはとても面白い内容だと思いますが、 普通の Java 開発者が普段の仕事でプロダクションコードで使う場面はあまりないでしょう…

セッションのスライドはこちらで公開されています。

Disciplined Locking: No More Concurrency Errors

Checker Framework の中の人、Werner Dietl 先生と Michael Ernst 先生によるセッションで、 主に @GuardedByアノテーションの使い方とコード検証にまつわる話でした。

@GuardedByは 2006 年に Java Concurrency in Practice の作者、Brian Goetz さんが提案したもので、 データ競合を防ぐためのロックを文書化するためのアノテーションで、いまやデファクトスタンダードになっています。

しかし、このアノテーションには正式な定義がないため、解釈によって意図した使い方と異なる実装になる可能性があるので、 このセッションで、@GuardedBy の定義を厳密化したうえで、Checker Framework によるソースコード検証方法を説明しました。

f:id:chyiro:20160920192339j:plain

ちなみに、このセッションの元ネタとなる論文はこちらです。興味のある方はぜひご一読を。

裏番組も(たぶん)つづきます

初日の会場の寒さに負けて、風邪気味になってきましたが、体力がある限り更新続けて多くの情報をお届けしたいと思います。 もし体力が尽きてダウンになったという事態になったら…まあ、その時にまた考えます。