エンジニア的なネタを毎週書くブログ

東京でWebサービスの開発をしています 【英語版やってみました】http://taichiw-e.hatenablog.com/

"Fiber" で 100万スレッドが実行可能に!? - Project Valhalla とProject Loom : JavaDayTokyo 2018 参加レポート2 #JavaDayTokyo

Project XXX系の話について、Project ValhallaとProject Loomについて聞きました。
どちらも講演はDavid Buckさん*1

残念ながら、どちらもJava11には入らないので、LTSのリリースサイクルを考えるとまともにサービスで使えるのは早くて2021年…
とはいえ、どちらもとても夢のある話でした。

Project Valhalla

Value Types (値型)

class Point {
   int x;
   int y;
}

のような、プリミティブ型をフィールドとして持つクラスがある時に

  Point[] points;

配列を作ると、各Pointインスタンス毎にヘッダを持ってしまい、大きなメモリのオーバーヘッドが発生します。
メモリの最適化だけ考えると

  int[] xList;
  int[] yList;

とプリミティブ変数の配列を宣言するのが最も良いのですが、これではせっかくのオブジェクト指向が台無し。

そこで、「例えば*2

value class Point {
   int x;
   int y;
}

このようにクラス宣言した際に、さも intの配列が2つあるかのようなメモリ確保がされる… というのが概要です。
これによって、省メモリ化に加えて、参照の高速化も図ることができるようになります。

ここまでは昨年のJavaDayTokyoでも既に紹介されていました。

Generic Specialization (ジェネリックの特殊化)

上記を実現する過程で、このようなことができる様になる… と紹介されました。

ArrayList<int> xList;

要はプリミティブ型がほとんど普通のオブジェクトのように使えると。
さらに、intStreamのような(普通のstreamと別にメソッドを用意しなくてはならないような)「ダサい」対応も不要になるとのことです。

とは言えいろいろ悩んでるらしい

とは言え、この「ジェネリックの特殊化」をいざ実装しようとすると悩ましい課題が多いらしく… まだまだ実用化には時間がかかりそうでした。

実際の所、どのくらい使えるんだろう

現実的な利用シーンを考えると、フィールドにプリミティブしか持たないクラスというのはあんまりない気も。
せめて、StringやLocalDate系が混ざっていてもうまいこと扱っていただけるようになると良さそうなのですが。

Project Loom

こちらがタイトルの、”100万スレッド”です。
現在のJVMでは、JVM上のスレッドは、OSが管理するスレッドとマッピングされています。それぞれのスレッドは、用途が異なるかもしれません。あるスレッドは複雑な暗号化に使われるかもしれないし、またあるスレッドは単に変数を一つ書き換えるだけの簡単な処理に使われるかもしれません。

しかしながらOSは、アプリケーションのコードを知らないため、各スレッドの用途もわかりません。そのため、どのスレッドも一律、「何にでも使えるスレッド」を用意することになります。

ここで、「Fiber」という考え方が登場します。Fiberは、OSではなく、Javaのruntimeやユーザコードによって支配されるスレッド。アプリケーションはスレッドの用途を知っているため、無駄のないスレッドを効率的に作ることが可能です。その結果、OS管理のスレッドに比べてなんと1000倍ほど数のスレッドが作れるようになるとのこと。
それだけOSが作るスレッドには「無駄」があるそうです。

ブロッキングと非同期

ちょうど一年前のJavaDayTokyoで聞いた話ですが、
taichiw.hatenablog.com
ブロッキングな処理はスケールしにくい、という問題点があります。
その対策として、非同期(ノンブロッキング)に処理を制御する、という方法があるものの、プログラミングやデバッギングが難しい、という問題があります。

この双方の問題を解決するのがFiber.
スレッドモデル(=ブロッキングな処理)であるため取扱が簡単であるにもかかわらず、スケーラビリティに優れるという夢のようなお話です。

言ってることが未来

Fiberはスレッドなので、「どんな処理が」「どこまで進んだか」が管理されています。
他方、JVM上で管理されているオブジェクトなので、Serializeが可能とのこと。
その結果何ができるようになるかと言うと…

  • 実行中のスレッドをSerializeして保存。JVM停止。→JVMを起動してスレッドの続きを実行
  • 分散データベースに於いて、「処理を他のサーバに転送」

と言ったことができるようになるとのこと。

… よくわかりません。

まだ検討段階

実際の所、まだまだ開発が始まったばかりでCommitもないとか。
早くて今年中にアーリーアクセスが出る…… かも。

とのことでした。

しかしとっても夢のある話。実現が楽しみです。

*1:基調講演でFlight Recorderのデモもされて… 来週末の JJUG CCCでもセッションがあるそうで… 寝不足で頭が回ってないといってましたがこれだけ準備してたら、そらそうでしょうなぁ…

*2:まだ決まったわけではない… と強調されてました