【コラム】
Leopardの発売から1カ月半が経過した。Objective-C 2.0に深く切り込みたいものとしては、Mac OS X 10.5であるDarwin 9.0に搭載されているObjective-Cランタイムのソースコード公開を待ち望んでいるのだが、なかなかその気配は訪れない。
ただ待っているだけでは仕方ないので、手持ちの材料だけでObjective-C 2.0を探っていくことにしよう。Appleから公開されているドキュメントと、Mac OS X 10.4であるDarwin 8.10で公開されているソースコードを参考にしていく。
では、前回の続きでガベージコレクションを探っていこう。
本連載としては、まずソースコードレベルから話を始めたかったのだが、前述のとおりLeopardではまだソースコードが公開されていない。
だがよく考えると、ガベージコレクションの機能自体は、Tigerで実装されていることを思い出した。たとえば、TigerのXcodeでビルドの設定を調べると、「Objective-Cガベージコレクションを有効にする」という項目がある。
|
このように、ガベージコレクタ自体は実装されていた。ただし、Cocoaなどのフレームワークが対応していなかったため、使用することは事実上できなかったのだが。
そこで、TigerのObjective-Cランタイムのソースコードをあたってみよう。Darwin 8系の最新であるDarwin 8.10に搭載されている、objc4-274のソースコードを見てみる。すると、objc-auto.mというファイルがある。これが、Objective-Cランタイムでのガベージコレクションを担当しているものになる。
このファイルには、objc_collectという関数がある。ガベージコレクションを開始するトリガーとなるものだ。そのソースコードを見てみよう。
void objc_collect(void)
{
if (UseGC) {
auto_collect(gc_zone, AUTO_COLLECTION_FULL_COLLECTION, NULL);
}
}
auto_collectという関数を呼んでいる。この関数の実体はどこにあるのか?
実は、auto_collectはObjective-Cランタイムの機能では、ない。libautoという、ランタイムとは別の、外部のライブラリに含まれる関数だ。このlibautoライブラリが、ガベージコレクションを実現している。Objective-Cランタイムは、このライブラリの1クライアントという立場になる。libautoは、/usr/lib/libauto.dylibにある※。
※このlibautoとObjective-Cランタイムとの関係は、Appleのドキュメント「Garbage Collection Programming Guide: Architecture」にも記述されている。
では、libautoのソースコードは公開されているかというと、Darwinの状況や、objc-auto.mに書かれているコメントから判断するに、オープンソースではないようだ。
という訳で、ガベージコレクタの実体がlibautoにあることはわかったが、そのソースコードは得られないようだ。
とはいっても、objc-auto.mのソースコードからわかることもいくつかある。たとえば、autostatisticstという構造体の定義がある。これは、libautoで使われているもののようだ。
typedef struct {
unsigned version; // reserved - 0 for now
/* Memory usage */
unsigned long long num_allocs; // number of allocations performed
volatile unsigned blocks_in_use;// number of pointers in use
unsigned bytes_in_use; // sum of the sizes of all pointers in use
unsigned max_bytes_in_use; // high water mark
unsigned bytes_allocated;
/* GC stats */
/* When there is an array, 0 stands for full collection, 1 for generational */
unsigned num_collections[2];
boolean_t last_collection_was_generational;
unsigned bytes_in_use_after_last_collection[2];
unsigned bytes_allocated_after_last_collection[2];
unsigned bytes_freed_during_last_collection[2];
auto_date_t duration_last_collection[2];
auto_date_t duration_all_collections[2];
} auto_statistics_t;
libautoが管理するオブジェクトの統計的情報を表すもののようだ。メモリの使用状況や、ガベージコレクション発動後の状況が得られるようだ。この構造体の値は、libautoに含まれる関数、auto_collection_statisticsなどを使えば取得できるようだ。
これらの情報も使いながら、ガベージコレクションの動作を探っていきたい。
| 理研、脳・脊髄形成に必要な神経板湾曲の仕組みを解明 [20:16 5/25] |
| 京大、「慢性閉塞性肺疾患」患者の労作時呼吸困難は鍼治療が有効と実証 [20:08 5/25] |
| 120Hz SHVカメラ用イメージセンサーを使った撮像装置 - SHVフルスペック化へ [18:10 5/25] |
| 京大、視覚による物体認知は前頭前野からのトップダウン信号が重要と確認 [17:45 5/25] |
| 製品数の拡大だけでなくBCPの展開なども含めた総合力で事業の強化を図るTI [17:25 5/25] |
|
[9nine]制服姿見納め? セーラー服で登場も川島海荷「4人はコスプレ」 [19:15 5/27] エンタメ |
|
「NO.6」4巻は書き下ろしドラマCD付、木乃のサイン会も [18:49 5/27] ホビー |
|
[今週の新刊]マンガ大賞3回ノミネート「アイアムアヒーロー」 カープ愛「球場ラヴァーズ」も [18:33 5/27] ホビー |
|
「ゆりてつ」サイン会は作者と都電に揺られるツアー仕立て [17:45 5/27] ホビー |
|
【ネタバレもありの徹底解明コラム】『サザエさん』タマの意外な事実 [17:30 5/27] ホビー |
4つの診断で、自分の適性を見つめなおそう!
働くこと・挑戦し続けることへの思いを綴ったインタビュー
あなたにピッタリのアドバイスを読むことができます。
転職に必要な情報が収集できます
企業からアプローチのメッセージが届きます。