CLR托管内存
在物理内存中观察CLR托管内存及GC行为
虽然看了一些书,还网络上的一些博文,不过对CLR托管内存细节依然比较模糊。而且因为工作原因总会有很多质疑,想要亲眼看到内存里二进制数据的变化。
所以借助winhex直接查看内存以证实书上的描述或更进一步揣摩CLR托管内存的运作方式,这里写下来跟大家一起分享(由于自己这方面知识储备不太充足,下面的好多内容也是猜测,肯定有很对错误,希望了解的网友可以帮忙指正)
测试环境: windowsXP win10 win7 (dotnet4.0 Releases编译 ,下文截图为win7上的运行结果)
内存查看工具: winhex 7.5
虽然重点是监测二进制的内存,不过基本的测试代码还是要有的(测试是直接运行编译好的exe,没有使用调试模式,编译时要使用Releases,因为debug跟Releases在GC回收时对象是否可达的判断是不一样的)
下面对内存的查找部分看起来可能有点跳跃,因为是借助了反复测试得到的规律,很多过程没有赘述
进行之前需要先简单了解CLR对象分配(类型对象指针要知道),GC的基本过程(G0,G1,G2需要简单了解),二进制数据的存储(主要是大小端)
下图是测试中用到的引用对象的结构

下图为测试的主要步骤,会分8步进行,每一步也都标注出来了


第1监测点



第2监测点







监测点3 (为了验证刚刚的NextObjPrt的确是那块内存)



第4监测点 (重复创建10分份的typeA)




监测点5 (出RunCreat)

监测点6 (回收G0)




监测点7 (下一个地址从什么地方开始分配)


监测点8


监测点9




监测结束
上面写的比较杂乱,虽然很对东西还是没有弄明白也没有发现什么规律,不过至少可以得到下面的一些结果
1:证明了NextObjPrt 的存在,也了解他的基本行为(其结构后面数据可能还包含G0阈值等其他数据)
2:GC回收使用的标记方法的确是根搜索
3:被回收的内存不会被擦除,只是通过移动NextObjPrt标记下一个内存能被分配的位置
4:对象从G0移动到G1,内存本身不会移动(可能记录对象的指针的表会有相应更新)
5:不是每次回收都会压缩内存,大部分时间都维持原有结构
6:对象在内存中的存储细节
最后上面写了那么多,其实不单单就是为了看CLR物理内存,同样也是表达一种方法,用同样的方法也可以查看包括jvm在内的几乎所有进程的物理内存,同时winhex不仅可以查看,还拥有在运行时直接修改物理内存的能力。
CLR托管内存的更多相关文章
- 在物理内存中观察CLR托管内存及GC行为
虽然看了一些书,还网络上的一些博文,不过对CLR托管内存细节依然比较模糊.而且因为工作原因总会有很多质疑,想要亲眼看到内存里二进制数据的变化. 所以借助winhex直接查看内存以证实书上的描述或更进一 ...
- 在内存中观察CRL托管内存及GC行为
虽然看了一些书,还网络上的一些博文,不过对CRL托管内存的介绍都不是十分清楚,大部分都是一样的,如果再要了解细节就十分困难了. 所以借助winhex直接查看内存以证实书上的描述或更进一步揣摩CRL托管 ...
- VB.NET 内存指针和非托管内存的应用
介绍 Visual Basic 从来不像在C或C++里一样灵活的操纵指针和原始内存.然而利用.NET框架中的structures 和 classes,可以做许多类似的事情.它们包括 IntPtr, ...
- C# 托管内存与非托管内存之间的转换
c#有自己的内存回收机制,所以在c#中我们可以只new,不用关心怎样delete,c#使用gc来清理内存,这部分内存就是managed memory,大部分时候我们工作于c#环境中,都是在使用托管内存 ...
- 如何让IntPtr指向一块内存,以及托管内存与非托管内存的相互转化
IntPtr idp= IntPtr.Zero; StringBuilder idata = new StringBuilder("000000"); string idata = ...
- 记一次 .NET 某智慧水厂API 非托管内存泄漏分析
一:背景 1. 讲故事 七月底的时候有位朋友在wx上找到我,说他的程序内存占用8G,托管才占用1.5G,询问剩下的内存哪里去了?截图如下: 从求助内容看,这位朋友真的太客气了,动不动就谈钱,真伤感情, ...
- 记一次 .NET 某桌面奇侠游戏 非托管内存泄漏分析
一:背景 1. 讲故事 说实话,这篇dump我本来是不准备上一篇文章来解读的,但它有两点深深的感动了我. 无数次的听说用 Unity 可做游戏开发,但百闻不如一见. 游戏中有很多金庸武侠小说才有的名字 ...
- C# 中托管内存与非托管内存之间的转换
c#有自己的内存回收机制,所以在c#中我们可以只new,不用关心怎样delete,c#使用gc来清理内存,这部分内存就是managed memory,大部分时候我们工作于c#环境中,都是在使用托管内存 ...
- PerfView专题 (第五篇):如何寻找 C# 托管内存泄漏
一:背景 前几篇我们聊的都是 非托管内存泄漏,这一篇我们再看下如何用 PerfView 来排查 托管内存泄漏 ,其实 托管内存泄漏 比较好排查,尤其是用 WinDbg,毕竟C#是带有丰富的元数据,不像 ...
随机推荐
- OC学习篇之---文件的操作
今天我们来介绍OC中文件操作,在之前的文章中,已经接触到了文件的创建了,但是那不是很具体和详细,这篇文章我们就来仔细看一下OC中是如何操作文件的: 第一.首先来看一下本身NSString类给我们提供了 ...
- android请求
//请求 HttpURLConnection conn = (HttpURLConnection)new URL(path).openConnection(); conn.setConnecTimeo ...
- js cookie可选参数(document.cookie='name=张三;expires='+day;)
js cookie可选参数(document.cookie='name=张三;expires='+day;) 一.总结 1.可用secure属性来设置安全协议传输 2.expire属性用的比较多,其它 ...
- https://github.com/mvf/svn_wfx
https://github.com/mvf/svn_wfx 2003.net对应的vc是7.0版本.需要更高的. 在哪里可以下载呢 https://www.tjupt.org/没有校外种子 Proj ...
- Java内部抛出异常外部不能catch问题分析
今天在论坛看到一篇关于异常处理的文章,异常处理机制详解开头就搬出了这样一个例子: public class TestException { public TestException() { } boo ...
- ios开发缓存处理类NSCash类的了解与使用
一:NSCash的基本了解 #import "ViewController.h" @interface ViewController ()<NSCacheDelegate&g ...
- HtmlParser基础教程 分类: C_OHTERS 2014-05-22 11:33 1649人阅读 评论(1) 收藏
1.相关资料 官方文档:http://htmlparser.sourceforge.net/samples.html API:http://htmlparser.sourceforge.net/jav ...
- 手动打war包进行部署测试
有的时候项目跑不起来但是又不知道tomcat问题还是其他问题,往往新建个项目,打成war进行部署.今天找到个好方法,手动打成war,然后进行部署测试. image.png image.png 创建一个 ...
- USB 3.0规范中译本 第10章 集线器,主机下行口以及设备上行口规范
本文为CoryXie原创译文,转载及有任何问题请联系cory.xie#gmail.com. 本章描述USB 3.0 集线器的体系结构要求.本章还描述主机下行口和集线器下行口之间功能性的不同之处,以及设 ...
- Android 添加常驻图标到状态栏
/ * * 如果没有从状态栏中删除ICON,且继续调用addIconToStatusbar,则不会有任何变化.如果将notification中的resId设置不同的图标,则会显示不同的图标 * / p ...