kkamegawa's weblog

Visual Studio,TFS,ALM,VSTS,DevOps関係のことについていろいろと書いていきます。Google Analyticsで解析を行っています

4GBのメモリ積んだマシンで意図しないGCが発生する

Using .NET with >4GB RAM - daclark's WebLog - Site Home - MSDN Blogs経由
FIX: Generation 1 garbage collections and generation 2 garbage collections occur much more frequently on computers that have 2 GB or more of physical memory in the .NET Framework 1.1より
 機械翻訳の日本語版はわかりづらいので英語版のサポート情報にリンク。4GBの物理メモリ(当然論理メモリじゃありません)を搭載したマシンで.NET Framework 1.1のアプリを動かすと第一世代GCではなくて、第二世代GCが頻繁に発生してしまうとのこと。第一世代GCはGlobalMemoryStatus()というAPIを使って、ガーベージコレクションの情報としているんだけれど、このAPIが2GB超のメモリのことを考えていなかったおかげで、意図しない世代のガーベージコレクションが動作していたんだそうな。
 GlobalMemoryStatusEx()に変えたパッチが用意されているとのことなので、有償サポートに連絡すればもらえるらしい。私の1.1ランタイムをみてみたら、確かに古いバージョンが入っていた。
 MSDNGlobalMemoryStatusのヘルプをみてみると、確かに

4GB を超えるメインメモリを実装したコンピュータでは、GlobalMemoryStatus 関数は誤った情報を返す可能性があります。Windows 2000 は、-1 という値を使ってオーバーフローを表します。Windows NT の従来のバージョンは、実際のメモリに対する 4GB の剰余( たとえば 5GB の場合、剰余は 1GB)を返します。この理由により、Windows 2000 では代わりに GlobalMemoryStatusEx 関数を使ってください。

 と書かれていますね。GlobalMemoryStatusEx()はWindows 2000以降でのサポートだから、2GB以上積んだNT4.0マシン*1.NET Framework 1.1アプリを動かすときはどうするんだろう(って、そんなの気にしない?)。一応NT 4.0 Enterprise Editionではサポートしているのか…。

*1:もうサポートは切れちゃったけれど