[日文版]《垃圾回收的演算法與實現》作者中村成洋&相川光:高手對話,揭祕GC(圖靈訪談)

劉敏ituring發表於2016-10-24

訪談物件:

中村成洋
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を勉強したい!」と思う人が、より楽に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


——更多訪談


更多精彩,加入圖靈訪談微信!

相關文章