BoehmGCを使おう!



DxLibFanに戻る




BoehmGCとは?

BoehmGCとはBoehm-Demers-Weiser conservative GCの通称です。
いわいるガーベジコレクター機構を実現するためのライブラリでこの手のライブラリの中ではとても有名です。
簡単に言いますと、malloc()してもfree()しなくてよい!newしてもdeleteしなくてよい!といった感じです。
conservativeなので保守的なGCです。GC処理の方法にも様々な方法があるようですが、それは後述します。
このライブラリを発見した当初、私は大喜びしました。なぜならmallocした後のメモリリークチェックデバッグに時間を使わなくて済むと思ったからです。
ですが、これは幻想でした。(BoehmGCの弱点に続く・・・)

BoehmGCの弱点

http://d.hatena.ne.jp/yaneurao/20040410によると GCで確保したメモリ領域を全部たどって解放されていないメモリを調べていくので大きいメモリ領域を確保した場合、その処理にとても時間がかかるそうです。
確かにこんなことされてはたまりません。
よって画像に使うメモリ等、数百キロバイトから数メガバイト単位のメモリを使う場合は素直にmalloc()free()を使うべきです。

ダウンロード先および準備

A garbage collector for C and C++ Where to get the collector
よりgc_source/.のリンク先をクリックして ダウンロードします。
私が今記事を書いている時点でgc6.8.tar.gzがリリースされています。

そしてアーカイブを解凍し使える状態にしてからinstallなりmakefileなりして使える状態にします。
VCで使う場合README.win32あたりを読み大体の憶測をつけてmakefileします。(大雑把ですが^^;)

その中にNT_MAKEFILE,NT_STATIC_THREAD_MAKEFILE,NT_THREAD_MAKEFILEがあります。。
意味はそれぞれの名前の通りだと思います。ここではその詳細については割愛し、 早速使ってみたいと思います。

MakefileをMakefile.bakにリネーム。
NT_MAKEFILEをMAKEFILEにリネーム。
コマンドプロンプトでアーカイブを解凍したフォルダに行く。
(例:C:\gc6.8に解凍した場合はコマンドプロンプトを起動してcd c:\gc6.8を打ち込んだ後にc:を打ち込む)
nmake nodebug=1 allを打ち込む。
そうすると自動でコンパイルしてくれます。
gc.libが生成される。
その後、テストをする為にgctest.exeと打ち込む。gc.logが出力される。
gc.logを覗いてみる。
Switched to incremental mode
Emulating dirty bits with mprotect/signals
Completed 1 tests
Allocated 571421 collectable objects
Allocated 101 uncollectable objects
Allocated 1250000 atomic objects
Allocated 10880 stubborn objects
Finalized 2206/2206 objects - finalization is probably ok
Total number of bytes allocated is 59416624
Final heap size is 3764224 bytes
Collector appears to work
私の環境では以上のような出力になりました。
以上です。

ライブラリの使い方

gc.libをリンクし、gc.hをインクルードします。gc.hはincludeフォルダに入っています。
主に以下の関数を使ってプログラミングします。
native cstdBoehmGC
mallocGC_malloc
freeGC_free (使用は奨励されていない)
reallocGC_realloc
注意:GC_mallocで確保した領域をfreeで解放しないことです。例外なくエラーになり予想のつかないバグが発生します。
これでmalloc()free()の面倒な方法から解放され、 GC_malloc()のみを使ってプログラミングしていくことになります。
使い方のコツとしては細かなサイズのメモリ領域確保に使用することです。

サンプルプログラム

いちいちBoehmGCをダウンロードしてきてmakeするのがめんどくさいという方に VCでコンパイルしたライブラリファイルおよびサンプルプログラム(boehmgcフォルダ)を用意しました。
以下からダウンロードしてください。
DxLibFanで作ったサンプルプログラム集
以上。

小話

実はBoehmの発音はどうなのだろうと考えていた時期がありました。
高校生の時はボエホン(笑)(ドアホンかよ!)と心の中で読んでいましたが、最近はボーンって心の中で読んでいました・・・。
ですが、
http://d.hatena.ne.jp/textfile/20060808/boem
によると、ボウムだったんですね。赤面モノです。



以下は高校生時代に書いた概要です
BoehmGCとは?
BoehmGCとはメモリ管理ライブラリです。
メモリ管理ライブラリって何よ!?
具体的に言いますと、C言語ではメモリを確保するのにmalloc(またはcalloc,realloc等等) C++言語ではnewですね。(まぁmallocも使えないことは無いけど^^;)
それらのメモリはfreeやdeleteしないとメモリリークというバグの原因になり、危険なんです。
なので高性能なメモリ管理機構が必要なわけで、(garbage collector (ガベージコレクタ(ガーベジコレクタ)) (直訳するとゴミマニア、またはゴミオタク(直訳合ってないよ) 使わないメモリを採集するらしい))
それらの管理方法はなんか大学レベルらしいです^^;
d金魚はヴぁかだからわからないですが^^;m(*- -*)mス・スイマセーン。
でも、このBoehmGCを使うとほんとに楽なんですよ!!マズィで!
なんと!freeを呼び出さなくて良いんです!
詳しくは以下で検索してみてくれ。
BehonGCの奨励情報
Boehm GC の使い方情報
ダウンロード先を検索(DownLoad)

new deleteよりBoehmGCの方が速い!?


実験環境:
●●●● CrystalMark 0.6.13.36 2002/7/30 (C)ひよひよ ●●●
Crystal Dew World [ http://kotan.ec.hokudai.ac.jp/~hiyohiyo/ ]
【 CPU 】:Athlon XP (Palomino)
【 クロック 】:1666.72(133.34x12.50) MHz x 1
【 CPUID 】:AuthenticAMD 662
【 NameString 】:AMD Athlon(tm) XP 2000+
【 OS 】:Windows2000 [ 5.0 Build 2195 ]
【マザーボード】: [ AMD 760 ]
【ビデオチップ】:NVIDIA GeForce3 Ti 500 (NV20)
【 メモリ環境 】: [ 512 MB ]
【 HDD 】:ST380021A
【 画面モード 】:1024x768 (16bit) Smoothing None
【CrystalMark 】: 25325
【 ALU 】: 4679
Fibo : 1370 e : 1718 Eratos: 1591
【 FPU 】: 5935
Pure : 1785 Rand : 2396 FFT : 1754
【 GDI 】: 1729
Text : 237 Square: 271 Circle: 772 BitBlt: 449
【 MEM 】: 2783
Read: 258 MB/s
Write: 321 MB/s
Read/Write: 210 MB/s
CacheR/W: 1994 MB/s
【 HDD 】: 6136
Read: 37.9 MB/s ( 1943)
Write: 33.5 MB/s ( 1716)
RandomRead: 24.3 MB/s ( 1242)
RandomWrite: 24.1 MB/s ( 1235)
【 Total 】: 2272
Mandelbrot: 683
QuickSort: 1589
【 DirectDraw 】: 1791
10: 78.6 FPS ( 7)
100: 69.9 FPS ( 69)
500: 46.6 FPS ( 233)
1000: 32.7 FPS ( 327)
5000: 10.9 FPS ( 545)
10000: 6.1 FPS ( 610)
ソースはこれ
これ実験結果。
LoopNum=1245044
BoehmGCTime=1245044msec
new and delete Time=1245056msec
さてさて、これはこれで良いのですが^^;
newの方はdelete使っているから遅くてあたりまえジャン!って思ってませんか?

いやいや、BoehmGCもループが終了(また最初に戻る)時点でメモリを開放しているようなのです。
以下に示します。

・BoehnGCを使わずかつdeleteで開放しない場合
while(1){
 char *p=new char[256]
 //delete p[]
}
メモリ増えまくり

うわーメモリ増えまくりだよ。

終了させたら開放しまくり

あらあら、デバックスタートで起動させていたけど終了したら一気に開放したよ。

・BoehnGCを使う
while(1){
 test *p = new test;
}

全然メモリ増えない

おいおい!増えないジャン!こりゃぁ便利だぁ!!ヽ(゜▽、゜)ノ ウヘヘヘ(壊)

BoehmGCをコンパイルする

さて〜〜。BoehmGC(以下GC)の凄さが分かったところで!! (smart pointerの方が良いと掲示板等で見るが 私の技術レベルでは到底理解できない。 smart pointerはWindowsプロフェッショナルゲームプログラミングに 説明が書いているので参照してください。)
GCをダウンロードしてきましたか??
GCのコンパイルはどうするのよ〜〜。って思いませんか?
VisualC++のプロジェクトが無いじゃないか!ヴぁか!って!?
私も最初はコンパイルの仕方にとまどりました。
しか〜し、makefileというコンパイルの方法??らしき物?を記述したファイルがあるので、 それをプロジェクトに追加して命令を加えると、VCが勝手にコンパイルしてくれるようです。
って事でチュートリアル形式で進みますか^^
  1. まずはHans-J. Boehm 氏に感謝。Very good なライブラリの製作、公開、有難う御座います。
  2. A garbage collector for C and C++で"gc_source"という所をクリックすると、大体、ダウンロードできる。
    私の使いっているバージョンは、GC6.1です。今(2003/04/08現在)だと、gc6.2alpha4まで出ているようですね。
    そろそろVersionUpしようかな〜〜^^
  3. ではダウンロードして適当なところに解凍してください。私の場合、解凍ソフトは"Lhaca デラックス版"でした。
  4. 次回へ続く!!(なんか需要がなさそうなので…。はやく続きを書いてくれ!って方は掲示板に催促お願いします。
  5. ガベコレ雑技団(謎

    BoehmGCのガーべジコレクションの方法はmark-sweep方式らしいことが判明した。 その他のガベコレ方法として copying collection や asymptotic complexity があるらしい事も分かった。
    BoehmGCは完全にコレクションしきれないらしい。つまり、メモリリークが起こる可能性があるそうだ。
    ぶっちゃけ、そんなに気にすることは無いくらいの容量なのだが、私のような狂気的完全主義者(笑)には”なんだかな〜”なのだ。
    なので、その他の方法を見てみることにした。 探していたら最強に分かりやすい日本語の資料を発見^^
    http://www.ueda.info.waseda.ac.jp/~yamane/ http://www.is.s.u-tokyo.ac.jp/~vu/jugyo/processor/process/soft/compilerresume/index.html


    参考サイト、文献




更新履歴
2006年8月9日:BoehmGCの記事を大幅改訂
2003年2月26日:BoehmGCの使い方を掲載
2003年2月27日:BoehmGCの使い方を更新
2003/04/08:ソースをUP。
14:34 2003/04/27:ソースが上手くUPできてないのを修正
0:38 2003/07/27:ガベコレ雑技団(謎)の記事をUP
2004/05/11:BoehmGCの参考サイト、文献をUP
DxLibFanに戻る DxLibのダウンロードは以下から
Dxライブラリ置き場
DxLib Copyright(C) 山田 巧

The program using DxLib.
The text of this page.
広告 [PR]スキンケア  転職 化粧品 無料 ライブチャット