C# リフレクション MethodInfo型をRuntimeMethodHandleに変換しメモリ使用量を節約する

MethodInfo型オブジェクトをメモリに載せておくよりは、MethodInfoオブジェクトをRuntimeMethodHandleに変換してメモリに保持しておくほうが、メモリ使用量を節約できる。

using System;
using System.Reflection;
using System.Collections.Generic;

public sealed class Program
{
    public static void Main()
    {
        Console.WriteLine("メモリ使用量の初期値: {0}[B]",
            GC.GetTotalMemory(true));

        List<MethodInfo> methodInfos = new List<MethodInfo>(); ;

        //たくさんのMethodInfoオブジェクトをListに格納する
        Module m = typeof(String).Module;
        foreach (Type t in m.GetTypes())
        {
            methodInfos.AddRange(t.GetMethods());
        }
        
        Console.WriteLine("MethodInfoをたくさんListに格納後のメモリ使用量: {0}[B]",
            GC.GetTotalMemory(true));

        List<RuntimeMethodHandle> methodHandles =
            methodInfos.ConvertAll<RuntimeMethodHandle>(
            delegate(MethodInfo mi) 
            { 
                return mi.MethodHandle;
            });
        GC.KeepAlive(methodInfos);
        methodInfos = null;//GCを可能にする

        Console.WriteLine("MethodInfoをRuntimeMethodHandleに変換後のメモリ使用量: {0}[B]",
            GC.GetTotalMemory(true));
    }
}

  • 結果は以下の通り。MethodInfoをRuntimeMethodHandleに変換した際には、かなりメモリ使用量に差が出た。

  • メモリ使用量の初期値: 171932[B]
    MethodInfoをたくさんListに格納後のメモリ使用量: 5079172[B]
    MethodInfoをRuntimeMethodHandleに変換後のメモリ使用量: 360628[B]