[日文版]《垃圾回收的演算法與實現》作者中村成洋&相川光:高手對話,揭祕GC(圖靈訪談)
訪談物件:
中村成洋
Network Applied Communication Laboratory Ltd. 研究員。因為偶然的機會對GC產生濃厚興趣,其本人卻說不清楚為何喜歡GC,當被人追問原因時,總是回答“是緣分”。現在是CRuby的commiter,每天致力於GC的改善。如你所猜,跟Ruby之父——松本行弘是同事。執筆本書的“實現篇”。
個人網站:http://www.narihiro.info/
相川光
遊戲開發者。京都大學學習期間開始研究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の面白さや奧深さを、より大きなものにしていただければ、これほど嬉しいことはありません。
更多精彩,加入圖靈訪談微信!
相關文章
- 《垃圾回收的演算法與實現》作者中村成洋&相川光:高手對話,揭祕GC(圖靈訪談)演算法GC圖靈
- 《垃圾回收的演算法與實現》作者中村成洋&相川光訪談問題有獎徵集(圖靈訪談)演算法圖靈
- 如何評價《垃圾回收的演算法與實現》及作者中村成洋?演算法
- 《CSS揭祕》作者Lea Verou訪談問題有獎徵集(圖靈訪談)CSS圖靈
- 有獎 |《Lua設計與實現》作者codedump訪談話題徵集(圖靈訪談)圖靈
- [英文版]《CSS揭祕》作者Lea Verou:I love the openness of our industry (圖靈訪談)CSS圖靈
- 《圖靈的祕密》作者Charles Petzold訪談問題徵集圖靈
- 《圖靈的祕密》作者Charles Petzold:我眼中的圖靈機和Windows(圖靈訪談)圖靈Windows
- 《CSS 揭祕》作者Lea Verou:我喜歡分享開源的行業文化(圖靈訪談)CSS行業圖靈
- 《演算法圖解》作者Adit Bhargava訪談問題徵集(圖靈訪談)演算法圖解圖靈
- 《CSS揭祕》譯者CSS魔法訪談問題有獎徵集(圖靈訪談)CSS圖靈
- 《垃圾回收的演算法與實現》第2章GC標記-清除演算法演算法GC
- 有獎 |《人工智慧簡史》作者尼克訪談話題徵集(圖靈訪談)人工智慧圖靈
- 《跟阿銘學Linux》作者阿銘訪談話題有獎徵集(圖靈訪談)Linux圖靈
- 《用資料講故事》作者Cole Knaflic訪談話題有獎徵集(圖靈訪談)圖靈
- 對話高博(二)| 換工作這件事(圖靈訪談)圖靈
- 《演算法問題實戰策略》作者具宗萬訪談問題有獎徵集(圖靈訪談)演算法圖靈
- Susan Lammers:與程式設計大師們的對話(圖靈訪談)程式設計圖靈
- Unity GC垃圾回收UnityGC
- Java——GC(垃圾回收)JavaGC
- GC垃圾回收器GC
- 《演算法新解》作者劉新宇訪談問題有獎徵集(圖靈訪談)演算法圖靈
- 《機器學習》作者Peter Flach訪談問題有獎徵集(圖靈訪談)機器學習圖靈
- 《Lua設計與實現》的作者codedump:學習也要講究價效比 (圖靈訪談)圖靈
- [英]Susan Lammers:與程式設計大師們的對話(圖靈訪談)程式設計圖靈
- 網際網路揭祕:AI 的神話與現實AI
- 【JVM第八篇--垃圾回收】GC和GC演算法JVMGC演算法
- 《黑客與設計》作者David Kadavy訪談問題有獎徵集(圖靈訪談)黑客圖靈
- 《SQL基礎教程(第2版)》作者MICK(ミック)訪談話題有獎徵集(圖靈訪談)SQL圖靈
- 淺談垃圾回收演算法演算法
- 《特斯拉》作者卡爾森教授訪談問題有獎徵集(圖靈訪談)圖靈
- 《釋出!》作者Michael Nygard訪談問題有獎徵集(圖靈訪談)圖靈
- 專家審讀——《垃圾回收的演算法與實現》演算法
- .NET垃圾回收(GC)原理GC
- 深入理解Java的垃圾回收機制(GC)實現原理JavaGC
- 垃圾回收演算法|GC標記-清除演算法演算法GC
- 《演算法圖解》作者Adit Bhargava:插圖筆記法解除演算法的魔咒(圖靈訪談)演算法圖解筆記圖靈
- GC垃圾回收機制: 淺析與理解GC