Hatena::Groupmoz-addon

Ci.nsIZIGOROu

2008-02-07

JScriptのGlobalObj#CollectGarbage()メソッドで強制GC

| 00:50 |  JScriptのGlobalObj#CollectGarbage()メソッドで強制GC - Ci.nsIZIGOROu を含むブックマーク はてなブックマーク -  JScriptのGlobalObj#CollectGarbage()メソッドで強制GC - Ci.nsIZIGOROu

前々からこのメソッドがあるのは知ってたんだけど、最近気になる記事を見かけたので実際に試してみた。

CollectGarbage()メソッドとは

SYSTEM32\jscript.dllをOLEViewで見ると分かるけど、Dispinterface GlobalObjで次のように定義されている。

[id(0x00000019)]
VARIANT CollectGarbage();

まぁ名前からしてどう見てもGCするぜって主張してる訳です、はい。

*1

で気になったフレーズ

CollectGarbageを使用してオブジェクトを強制的に破棄するためには 関数外で CollectGarbageを呼び出されければならないっぽい。 OfficeのActiveXだけかわからないが・・・ JScriptのCollectGarbage

そうなんだ、じゃあ試しにやってみよう。

共にタスクマネージャでcscript.exeのプロセスを監視(目視?)する事にします。

テスト1
for (var i = 0; i < 1000; i++) {
  (function() {
    var arr = [];
    for (var j = 0; j < 10000; j++)
      arr.push(j);

    WScript.StdOut.Write(".");
    WScript.Sleep(1000);
  })();

  WScript.Sleep(2000);
}
テスト2
for (var i = 0; i < 1000; i++) {
  (function() {
    var arr = [];
    for (var j = 0; j < 10000; j++)
      arr.push(j);

    WScript.StdOut.Write(".");
    WScript.Sleep(1000);
  })();

  this.CollectGarbage(); // ここがポイント
  WScript.Sleep(2000);
}
テスト3
for (var i = 0; i < 1000; i++) {
  (function() {
    var arr = [];
    for (var j = 0; j < 10000; j++)
      arr.push(j);

    WScript.StdOut.Write(".");
    WScript.Sleep(1000);
    this.CollectGarbage();
    WScript.Sleep(2000);
  })();
}
結果

テスト1は僕の環境ではだいたい6.7KB位でメモリ使用量が一定になった。

一方でテスト2は6.7KBと6.2KBで交互にメモリ使用量が表示される。

テスト3ではまだスコープを抜けてないからGCのしようが無いと思われ、テスト1と同じ結果となった。

おお、これは効果あるんじゃないすか?

ちなみに

WSHでは自分自身のプロセスIDが取りづらい*2ので、WMIを使ってプロセス特定しつつ使用メモリをプロットとかやりたかったんだけど、それは断念した。暇な時にきちんと追試したいと思う。

自分自身のプロセスIDが欲しい人は、MS系のScriptingの神である吉岡 照雄さんの作品のGetPID.VBSを参考にすると良いでしょう。

概略を言えば、

  • WshControllerでmshta等の「見えない」プロセスを作る
  • WMIからWin32_Processをmshtaのプロセスを条件としてselectする
  • 取れたレコードから親プロセスIDを取る→これが現在実行中のWSHのプロセスID

って手順になります。

うへぇー、めんどくさいw


WSHで無い機能を作る際って、WebBrowser Control立ち上げて機能の一部を拝借したりとか、今の例とか結構なりふり構わぬ実装が沢山あって色んな意味で面白い。

*1:関係ないけど、末尾に「はい」をつけて、amachangがdankogaiの真似をしてたけど、割と似てた

*2:相当トリッキーな仕組み