メモリ使いすぎ 4 〜 GCの単純なテスト 〜

試してみたよ。


import std.stdio;
import std.gc;
import std.random;
import std.md5;
import std.thread;

int main()
{
debug(b1) {
uint optval = 0;
test1(&optval);
}
debug(b2) {
uint optval = 1;
test1(&optval);
}
debug(b3) {
uint optval = 1;
Thread t1 = new Thread(&test1, &optval);
Thread t2 = new Thread(&test1, &optval);

t1.start();
t2.start();
t1.wait();
t2.wait();
}
debug(b4) {
uint optval1 = 1, optval2 = 0;
Thread t1 = new Thread(&test1, &optval1);
Thread t2 = new Thread(&test1, &optval2);

t1.start();
t2.start();
t1.wait();
t2.wait();
}

return 0;
}

int test1(void *optval)
{
int result;

do {
result = test2(optval);
} while (! result);

return result;
}

int test2(void *optval)
{
int fullcollect = *cast(uint*)optval;
ubyte bb = generateRandomBytes(rand() % 0x10000);
writef("%s\n", md5Sum(bb));

if (fullcollect) {
fullCollect();
}

return 0;
}

ubyte generateRandomBytes(uint size)
in {
assert(size != 0);
}
body {
ubyte bytes = new ubyte[size];
uint max = ubyte.max + 1;

for (uint i = 0; i < size; ++i) {
bytes[i] = rand() % max;
}

return bytes;
}


ubyte md5Sum(void[] data)
{
ubyte[16] hash;
std.md5.sum(hash, data);

return hash.dup;
}


無駄にメモリを使いまくるもの。

  • debug=b[1-4]でテスト内容を切り替え。

変に関数が多いのは、mainでループすると全くGCが動かないため。
(これはD言語研究室の説明にあるとおり)

@ 結果

  • b1

めっちゃメモリ増え続けてやばい。
ぜんぜん減らない。

  • b2

OK、ぜんぜん増えない。

  • b3

OK、ぜんぜん増えない。

  • b4

少しずつメモリ増え続けてやばい。
少しずつなのは別スレッドのGCが影響してループが遅いだけで、fullCollectを呼んでいないスレッドのメモリはぜんぜん開放されないみたい。

@ まとめ
各タスク(スレッド)ごとに定期的に自分でfullCollectを呼ばないとダメみたい??
newとかのタイミングで、チェックが入って勝手に呼ばれると思っていたんだけど・・・。

今は、全くそうしてないので、ためしてみよう。