论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
软件与程序人生
›
后端开发
›
.Net
›
Dotnet程序的内存与垃圾回收
Dotnet程序的内存与垃圾回收
惊落一身雪
金牌会员
|
2023-1-8 01:08:49
|
显示全部楼层
|
阅读模式
楼主
主题
860
|
帖子
860
|
积分
2580
都知道程序运行时的变量是放在内存里的,从我们学c++ 就知道有析构函数 malloc,还有学c#的时候天天 什么垃圾回收 GC 像背八股文样的 ,但是这个内存究竟能分配多少 没有人想过吧 ,不论做什么对未知的事充满好奇永远是前进发展的源泉,GC 怎样才能体现GC的运作 今天我们就来实验下吧。
首先初级的知识还是啰嗦一下:
构造函数负责按照模板在内存中实例化对象,当然你类的这些附加变量都是放在一起的,那么理所当然的我们就定义一个超大的数组来测试他。然后对应的~ClassName(){} 函数则在示例被销毁的时候执行 也就是垃圾回收的时候。于是乎有了下面这段代码:
1 public class Class3
2 {
3 public string Name { get; set; }
4 public int[] ar = null;
5 public Class3(string _name)
6 {
7 Name = _name;
8
9 ar = new int[20000000];
10 Console.WriteLine("my name is :" + Name);
11 }
12
13
14
15 ~Class3()
16 {
17 Console.WriteLine("GC working:" + Name);
18 }
19 }
复制代码
按照我们正常人的理解,以及以往C++的经验。你一个方法执行 执行完毕 所有花括号内的自动变量都会被销毁。但是new出来的东西确不一样属于malloc空间的 放在堆上 ,如果没有hold住地址就不能进行有效内存控制 进而就成了野指针 内存泄露。但是 我说但是 按照我们一个神经正常的人理解 你要自动化的处理这个事情 你会怎么做?你对象new完 放那 总要有一个东西在运行时就像一丝线一样一直把他挂着挂着的 ,没有东西把他挂着可不就代表这对象没用了么。我们建一个winform程序,按钮事件里先写段代码:
1 Random rdm = new Random();
2 Class3 c1 =new Class3(rdm.Next().ToString());
3
4 c1 = null;
5 GC.Collect();
复制代码
网上说这里做了c1=null后 立即就会触发回收,纯属是扯淡,这个完全是未知的, 但是调用GC.Collect()呢基本上呢确实至多第二次就会触发回收。但是如果我没把GC.Collect()去掉呢让其发展呢,这就要看心情了,有时候很久都不会有什么动作c1=null这句要不要都一样。根据数组大小我这边的运行情况基本上存储4组大概76M就会进行回收。如果有引用把对象挂着呢,当然 就不会进行回收,那么最大可以存多少呢?我这边特意把配置设为32位的情况下大概1.14Gb的时候就会溢出。
1 int cliCount = 0;
2 List<Class3> clist = new List<Class3>();
3
4 private void button1_Click(object sender, EventArgs e)
5 {
6 Random rdm = new Random();
7
8 Class3 c3 = new Class3(rdm.Next().ToString());
9 cliCount++;
10 Console.WriteLine("count:"+cliCount.ToString() );
11 clist.Add(c3);
12 }
复制代码
如果是x64则上不封顶,注意 内存的增长体现在红框处,满了后会自动继续扩,会超出实际物理内存。由于Windows系统是虚拟内存机制,内部进行了一些玄妙的处理咱也不了解。不管咋样对应程序来说当成正常区域访问。
通过上面的测试可以验证垃圾回收的机制基本上还是按照我们常规理解的套路去运作的的。 C++ 的时候要很谨慎 一层一层的 调用了new 一定别忘了delete 然后析构函数里也是一样。C#里把好多内存分配相关的弱化了 感觉析构函数差不多成摆设了。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
惊落一身雪
金牌会员
这个人很懒什么都没写!
楼主热帖
看完这个,还不会DVMA,请你吃瓜 ...
图文结合带你搞懂InnoDB MVCC
腾讯叶聪:朋友圈爆款背后的计算机视觉 ...
处理接口幂等性的两种常见方案 ...
Kubernetes(k8s)CNI(flannel)网络 ...
一个故事看懂CPU的SIMD技术
如何获取iphone的UUID
rust中的超时处理
关于 Java 的简介(评论抽奖送书) ...
聊一聊 TLS/SSL
标签云
存储
挺好的
服务器
快速回复
返回顶部
返回列表