访谈对象:

中村成洋
Network Applied Communication Laboratory Ltd. 研究员。因为偶然的机会对GC产生浓厚兴趣,其本人却说不清楚为何喜欢GC,当被人追问原因时,总是回答“是缘分”。现在是CRuby的commiter,每天致力于GC的改善。如你所猜,跟Ruby之父——松本行弘是同事。执笔本书的“实现篇”。

个人网站:http://www.narihiro.info/

enter image description here

相川光
游戏开发者。京都大学学习期间开始研究GC。热爱GC但讨厌打扫,除了GC之外还喜欢咖喱。执笔本书的“算法篇”。

访谈内容:

点击查看中文版

『ガベージコレクションのアルゴリズムと実装』は中国で多くの方たちに愛読されています。読者のみなさんを代表し、この場を借りて、中村先生に心より感謝申し上げます。ありがとうございます!本を書くには莫大な時間と労力が必要で、本が出版された後に同業者に批判されることもよくあります。技術書などは、特に指摘を受けやすいですね。中村先生と相川先生,どのような考えを元に、この本を作り上げたのですか?

中村先生: GCについて私が学ぼうと思ったとき、世の中に公開されているGCの情報はあまり多くなく、学ぶのにとても苦労しました。 ですので、この本は過去の私のように「GCを勉強したい!」と思う人が、より楽にGCを学べることを目指して書きました。

執筆はとても大変でしたが…。共著者・監修・編集のお三方に助けられてなんとか書き上げられました。 今にしてみれば若さでなんとかなった部分が大きいと思います…(笑)

相川先生: 本書は、プログラミングに関する知識をある程度持っている方を読者として想定しています。そのような方が読みやすいよう、プログラミングの初歩的な説明は最低限にとどめ、各アルゴリズムの説明をなるべく詳細に行うように心がけました。 また、ガベージコレクションの面白さも知っていただけるように努めました。

中国ではRichard Jones先生の著書「Garbage Collection」が既に翻訳されていて、既にGCに関する知識をお持ちの方も多かったかもしれません。しかし、本書では「Garbage Collection」出版当時にはなかったアルゴリズムも紹介しているので、また違った観点から楽しんでいただければと思います。

読者のみなさんに、プログラムの中でのガベージコレクション(以下、GCという)の役割について、簡単な説明をお願いします。

中村先生: GCというのはプログラムから見えなくなったゴミのメモリを自動で解放し、再利用してくれる仕組みのことです。

相川先生: GCは一言でいうと「自動メモリ管理システム」です。使われなくなったメモリ領域を自動で解放・再利用可能にしてくれる仕組みです。GCにより、プログラマはメモリ領域の解放忘れや二重解放の心配をする必要がなくなり、プログラミングにおける生産性を高めることができます。

現存するGCアルゴリズムのほとんどは、マークスイープGC、参照カウント、コピーGCの3つのアルゴリズムの分離または複合によって作り上げられています。先生は、将来の「真の4つ目のアルゴリズム」は、どんなものだと考えていますか?

相川先生: 3つの基本アルゴリズムが発見されてから、数十年の時が経ちました。この間、全く新しいアルゴリズムは登場していません。したがって、「真の4つ目のアルゴリズム」は、そう簡単には発明されないと思います。

一方、領域に基づいたメモリ管理法のように、GCとは異なる基準でメモリ管理を行う手法もあります。近い将来、全く新しいGCアルゴリズムが登場するのだとしたら、そのようなGC以外の手法からヒントを得たものになるのではないかと予想しています。

中村先生: 4つめのアルゴリズムは…、難しいですね。おそらく現実世界でも利用できるようなとてもシンプルなアルゴリズムのような気がします。「あー、そんな掃除の仕方があったか」みたいな。家事をよくやる人の方がひらめきやすいのかもしれまいですね(笑)

高級言語の多くは、GCを標準機能として備えています。この事実はGC技術の研究開発者にとってどんな挑戦、又はどんなチャンスになるのでしょうか?

相川先生: GCがまだそれほど普及していなかったころ、GCに求められる要件は「高速化」「省メモリ化」など、ごく限られたものだったかと思います。

近年は、GCを備えた言語が様々な用途・環境で使用されるようになっており、必然的にGCに対する要求も多様化しています。「消費電力の低下」「アプリケーションの停止時間の低下」といった、旧来のGCにはなかった要求が高まっています。そのような要求を満たすために、GCはまだまだこれからも研究の余地があるかと思います。

中村先生: GCという分野はとても難しく専門的な分野ですが、それを専門でやっている技術者は世界に数少ないでしょう。

たとえばゲリラ的にオープンソースの高級言語のGCを書いていったりコントリビュートしていけば、そのうちそれだけでご飯が食べられるようになると思います。

メモリ管理とGCは、将来のプログラミング言語を作る際に取り入れる標準機能になり得ますか?

相川先生: なり得ると思います。というよりも、既になっているといって差し支えないと思います。よほど特別な理由がない限りは、プログラミング言語はGCを標準で備えておくべきでしょう。プログラミング言語にGCを導入する方法は大きく分けて三通りあります。

一つめはJavaやPythonなど、GCを備えた言語を使ってプログラミング言語を実装することです。二つめは、BoehmGCに代表されるようなライブラリを使うことです。三つめは、自前で実装するというやり方です。

個人的には、是非とも一度、GCの実装に挑戦していただきたいと思っています。

中村先生: なりえます。というかもはや標準機能になりつつあります。 さらにGCを作りやすくなるようなサポートをハードウェアやOSなどから受けることになると考えています。

------------------------------------------------------------------------------------------------------------

続いては読者のみなさんから頂いた、実践の中で遭遇した問題についての質問です。

①プロセスレベルのGCの実現について:Erlangという言語はプロセスレベルのGCの仕組みを使用し、非常に効率的です。Erlangで実装されている言語の一つとしてElixirというものがあります。Elixirの文法はRubyに近く、ElangのGCの仕組みを(BEAMに基づいて)使用しています。先生はRubyの作者様の同僚として、Rubyにも詳しいと思います。ElixirのGCの仕組みについて、紹介して頂けませんか?

中村先生: ErlangのGCについては結構面白いらしいですね。

Erlangは軽量プロセス間で共有するオブジェクトが存在しないので、プロセス別にGCが可能だそうです。さらにオブジェクトがImmutableなので、そのオブジェクト作成後の新規オブジェクトに対する参照は絶対にありえません。

過去に存在するオブジェクトに対しての参照のみがあるということが言語仕様的に保証されています。この特性を利用して効率よくコピーGCを実装しているそうです。

私も詳しくは知らないので、読者のみなさまの課題とさせてください。

②GCアルゴリズムがモバイルデバイスの性能に与える影響について:一部のiOSのアプリケーションはJavascript関連の技術を使用し、V8はエンジン面でGCアルゴリズムを使ってリソースを解放しています。しかし一部の携帯電話はメモリが少なく(例えばRAMが1GBしかないiPhone)、GCの頻度が上がります。この場合、GCアルゴリズムがモバイルデバイスのアプリケーションの作動に悪い影響を与える可能性はありますか?悪影響がある場合、改善するにはGCアルゴリズムのパラメータをどう設定すればいいのですか?

中村先生: アプリケーションの特性によると思います。リアルタイム性の高いアプリケーション(ゲームなど)であればGCに気を使う必要があるでしょう。ですが、たとえばTwitterやFacebookのようなリアルタイム性が低いアプリケーションであればそれほど気にならないでしょう。

改善する場合には、それぞれのGCのマニュアルを読み、適切なパラメーターを与えてください。GCの間隔を短くする、ヒープサイズを小さくする…などですね。

それでも改善しない場合はアプリケーション側でGCに気を使ったコードに修正する必要があるかもしれません。

ケースごとに解決方法は変わってくるので、一概に「これが解決法です!」と言えないところがGC周りの難しいところですね。

相川先生: 世代別GCでは世代の数や昇格のためのしきい値など、調整すべきパラメータが多いです。具体的なアプリケーションの特性に応じて適切にパラメータの調整を行うことが必要となりますが、正直にいうと、 私はこのようなパラメータの調整をした経験があまりないため、申し訳ありませんがそのあたりのコツはわかりません。これに関しては、このあたりを見ていただいた方がいいかもしれません。https://docs.oracle.com/cd/E19528-01/820-1613/6nd986vcr/index.html(日文)

③莫大なデータ、例えばTBクラスのデータを処理する際、システムの安定性の確保・GCがプログラムに与える影響の軽減のためには、どのようにGCストラテジーを選択すればいいのですか?

相川先生: これはアプリケーションの特性を見て注意深く決める必要があるかと思います。私の感覚としては、巨大なメモリ領域に対してはコピーGCが有効な場合が多いです。(コピーGCのデメリットが相対的に小さくなるため)それでも「ごみが比較的多い」と、他のアルゴリズムが有効な場合もあります。あくまでもアプリケーションの挙動に大きく左右される点に注意しなければいけません。

中村先生: これも実際のデータの種類や達成したいゴールが何かによって回答が異なります。

リアルタイム性が必要な処理であれば、並行GCのように裏でGCを走らせるようなストラテジーがよいでしょう。

Webアプリのように若干止まっても構わなければ、Stop the worldなアルゴリズムでもいいですね。扱うデータが長生きするようなものであれば世代別GCを使って、扱うデータにたいするGC試行回数自体を減らしても効果があると思います。

④HotSpotのGCについてどう考えますか?DalvikVMやRubiniusとの違いはなんでしょうか?優劣の差はありますか?

中村先生: HotSpotのGCは素晴らしいと思います。 よくあれだけ複雑なものを運用できているなと感心しますね…。

GCのアルゴリズムはそれぞれにメリットがあればデメリットもあります。ですので、優劣はつけがたいのですが…

HotSpotにはたくさんのGCアルゴリズムが実装されており、その中からユーザがGCアルゴリズムを選ぶことができます。さらにチューニングのオプションも豊富に用意されています。ユーザがユースケースに応じて選ぶことができるという点でHotSpotのGCは他の言語処理系実装に比べて群を抜いて優れていると思います。

その一方で、逆に選択肢が多すぎてユーザが迷う…というのもあり、このあたりはなかなか難しいものですね。機械学習でチューニングパラメータやGCアルゴリズムを決定する研究もあるみたいですが、これも実用化は難しいみたいです。

相川先生: HotSpotVMは Mostly-Concurrent GC や G1GC など、最新のアルゴリズムをいち早く取り入れてきました。インタプリタ・バーチャルマシン本体にも開発コストを割かないといけないことを考えると、これは驚くべきことだと思います。

一方で、単純に他の処理系より優れている、とはいえません。GCの性能は結局のところ、アプリケーションの挙動に大きく左右されるためです。そこで、アプリケーションの特性に応じて、GCアルゴリズムの選択やパラメータの調整が行えれば、GCを最適化できるかもしれません。HotSpotVMはGCアルゴリズムの選択肢が比較的多く、他の処理系よりもGCの最適化を行いやすいといえます。

中村先生の手によって、Ruby 2.0にNon-recursive MarkingとBitmap Markingが新しく実装されました。中国の読者のみなさんに、Non-recursive MarkingとBitmap Markingの原理を紹介して頂けませんか?現在、RubyはGCの発展においてどのような努力と試みをしているのでしょうか?

Non-recursive Markingは、GC処理の最中に関数による再帰処理をしていたのでそれをやめようというやつです。自前でスタック構造を作って、そこにオブジェクトをのせて処理をするように実装しました。

Bitmap Markingはちょっと複雑です。Rubyはマーク・スイープGCを採用しています。このGCでは、はじめにすべての生きているオブジェクトを走査し、マークを行います。マークではオブジェクトのヘッダフィールド上のFL_MARKフラグを立てますその後、すべてのオブジェクトをもう一度走査して、すべての死んでいるオブジェクトのマークを外します。これの問題点は、CoWのセマンティクスを破壊してしまうことです。マークするすべてのページがDirtyになってしまうんですね。

Bitmap MarkingではオブジェクトのFL_MARKフラグだけを抜き取って、ビットマップとして一つの領域に格納します。これによりCoWの仕組みをうまく利用でき、Linuxでfork()を使っているようなプログラムでメモリ使用量を改善できます。

現在はRubyのGCから身を引き、隠居しております…。

中村先生と相川先生から、GC技術の開発者を目指す後輩たちに、何かアドバイスをお願いします。

中村先生: GCは答えのみつかりづらい面白くてチャレンジングな分野です。理論的な部分も大事ですが、実際に実装の泥臭い部分を見てみることがもっと大事だと考えています。簡単なものからでもいいので読んでみて、その後は実際に自分で作ってみましょう!

相川先生: GCは、とても面白くて奥の深いテーマです。それは、本書を読んでいただければ伝わることと思います。GCに関する論文を読んだり、GCを実装したり、他の技術者の方と議論することで、本書で知ったGCの面白さや奥深さを、より大きなものにしていただければ、これほど嬉しいことはありません。

enter image description here


——更多访谈


更多精彩,加入图灵访谈微信!