最近在看反射方面的东西的时候,看到最后发现一个与内存优化相关的东西,在此记录一下:以下是文中介绍的 MethodInfo 和 RuntimeMethodHandle 相互转换测试代码: 1 using System;2 using System.Collections.Generic;...
最近在看反射方面的东西的时候,看到最后发现一个与内存优化相关的东西,在此记录一下:


以下是文中介绍的 MethodInfo 和 RuntimeMethodHandle 相互转换测试代码:
1 using System;
2 using System.Collections.Generic;
3 using System.Diagnostics;
4 using System.Reflection;
5
6 namespace GenDLL
7 {
8 class Class1
9 {
10 const BindingFlags bFlags = BindingFlags.FlattenHierarchy | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
11 public static void Main(string[] args)
12 {
13 //显示在任何反射操作之前的堆栈的大小
14 Show("Before doing anying");
15
16 //为MSCorlib.dll中的所有方法构建 MethodInfo 对象缓存
17 List<MethodBase> methodInfoList = new List<MethodBase>();
18 //遍历定义 Object 类的程序集中定义的公共类型
19 foreach (Type type in typeof(Object).Assembly.GetExportedTypes())
20 {
21 //过滤任何泛型的类型
22 if (type.IsGenericTypeDefinition) continue;
23 MethodBase[] array = type.GetMethods(bFlags);
24 methodInfoList.AddRange(array);
25 }
26
27 //显示当绑定所有方法之后,方法的个数和堆的大小
28 Console.WriteLine("# of method = {0:N0} ", methodInfoList.Count);
29 Show("After building cache of MethodInfo Object");
30
31 //为所有的 MethodInfo 对象构建 RuntimeMethodHandle缓存
32 List<RuntimeMethodHandle> methodHandles = methodInfoList.ConvertAll<RuntimeMethodHandle>(mb => mb.MethodHandle);
33 Show("Holding MethodInfo and RuntimeMethodHandle of cache");
34 GC.KeepAlive(methodInfoList); //阻止缓存被过早的回收
35 methodInfoList = null; //现在允许进行回收
36 Show("After free MethodInfo Objects");
37
38 methodInfoList = methodHandles.ConvertAll<MethodBase>(rmh => MethodBase.GetMethodFromHandle(rmh)); //方式一
39 // methodInfoList = methodHandles.ConvertAll<MethodBase>(rmh => { return MethodBase.GetMethodFromHandle(rmh); }); //方式二
40 Show("Size of heap After re-creating MethodInfo Objects");
41
42 GC.KeepAlive(methodInfoList); //阻止缓存被过早的回收
43 GC.KeepAlive(methodHandles); //阻止缓存被过早的回收
44
45 methodInfoList = null;
46 methodHandles = null;
47
48 Show("After freeing MethodInfos and RuntimeMethodHandles");
49
50 Console.ReadLine();
51 }
52
53 static void Show(string str)
54 {
55 //用逗号隔开的数字,0 表示占位符 12:N0 表示用逗号分隔数字,至少占12个字符,小数点后的位数为0
56 string format = "Heap Size = {0,12:N0} - {1}";
57 Console.WriteLine(format, GC.GetTotalMemory(true), str);
58 }
59 }
60 }
编程小知识之 GC.KeepAlive :https://blog.csdn.net/tkokof1/article/details/92073033
织梦狗教程
本文标题为:C#反射之使用绑定句柄减少进程的内存消耗
基础教程推荐
猜你喜欢
- C# 如何调用python脚本 2023-07-04
- 用Linq从一个集合选取几列得到一个新的集合(可改列名) 2023-02-03
- C#流程控制详解 2023-06-21
- 检查Mysql DB的用户名和密码C# 2023-11-11
- c# – Sitecore 8(修订版150121),分析(MongoDB),错误“位置0没有行” 2023-11-09
- Unity Sockect实现画面实时传输案例原理解析 2023-04-27
- C#中List<T>存放元素的工作机制 2023-06-28
- WPF实现动画效果(一)之基本概念 2023-06-20
- C#实现读取匿名对象属性值的方法示例总结 2023-02-08
- 详解DataGridView控件的数据绑定 2023-05-22
