Dotnet程序的内存与垃圾回收
都知道程序运行时的变量是放在内存里的,从我们学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#里把好多内存分配相关的弱化了 感觉析构函数差不多成摆设了。
Dotnet程序的内存与垃圾回收的更多相关文章
- Java内存与垃圾回收调优
Java(JVM)内存模型 正如你从上面的图片看到的,JVM内存被分成多个独立的部分.广泛地说,JVM堆内存被分为两部分——年轻代(Young Generation)和老年代(Old Generat ...
- 【转】Java内存与垃圾回收调优
要了解Java垃圾收集机制,先理解JVM内存模式是非常重要的.今天我们将会了解JVM内存的各个部分.如何监控以及垃圾收集调优. Java(JVM)内存模型 正如你从上面的图片看到的,JVM内存被分成多 ...
- 推荐收藏系列:一文理解JVM虚拟机(内存、垃圾回收、性能优化)解决面试中遇到问题(图解版)
欢迎一起学习 <提升能力,涨薪可待篇> <面试知识,工作可待篇 > <实战演练,拒绝996篇 > 欢迎关注我博客 也欢迎关注公 众 号[Ccww笔记],原创技术文章 ...
- python内存管理&垃圾回收
python内存管理&垃圾回收 引用计数器 环装双向列表refchain 在python程序中创建的任何对象都会放在refchain连表中 name = '张三' age = 18 hobby ...
- Java进阶 JVM 内存与垃圾回收篇(一)
JVM 1. 引言 1.1 什么是JVM? 定义 Java Vritual Machine - java 程序的运行环境(Java二进制字节码的运行环境) 好处 一次编译 ,到处运行 自动内存管理,垃 ...
- [CLR via C#]21. 自动内存管理(垃圾回收机制)
目录 理解垃圾回收平台的基本工作原理 垃圾回收算法 垃圾回收与调试 使用终结操作来释放本地资源 对托管资源使用终结操作 是什么导致Finalize方法被调用 终结操作揭秘 Dispose模式:强制对象 ...
- Java编程思想学习笔记_1(Java内存和垃圾回收)
1.Java中对象的存储数据的地方: 共有五个不同的地方可以存储数据. 1)寄存器.最快,因为位于处理器的内部,寄存器按需求分配,不能直接控制. 2)堆栈.位于通用RAM,通过堆栈指针可以从处理器那里 ...
- Java 类加载机制 ClassLoader Class.forName 内存管理 垃圾回收GC
[转载] :http://my.oschina.net/rouchongzi/blog/171046 Java之类加载机制 类加载是Java程序运行的第一步,研究类的加载有助于了解JVM执行过程,并指 ...
- Java程序员的日常—— 垃圾回收中引用类型的作用
在Java里面,是不需要太过于关乎垃圾回收,但是这并不意味着开发者可以不了解垃圾回收的机制,况且在java中内存泄露也是家常便饭的事情.因此了解垃圾回收的相关知识就显得很重要了. 引用,在垃圾回收中是 ...
- 内存管理 垃圾回收 C语言内存分配 垃圾回收3大算法 引用计数3个缺点
小结: 1.垃圾回收的本质:找到并回收不再被使用的内存空间: 2.标记清除方式和复制收集方式的对比: 3.复制收集方式的局部性优点: https://en.wikipedia.org/wiki/C_( ...
随机推荐
- 高性能计算-雅可比算法MPI通信优化(5)
雅可比算法原理:如下图对方阵非边界元素求上下左右元素的均值,全部计算元素的数值计算完成后更新矩阵,进行下一次迭代. 测试目标:用MPI实现对8*8方阵雅可比算法迭代并行计算,用重复非阻塞的通信方式 # ...
- SSL免费证书之Let’s Encrypt
官网:https://letsencrypt.org/zh-cn 官网建议使用Certbot的方式进行安装,所以首先我们需要安装Certbot Certbot) 官网:Certbot (eff.org ...
- Laravel环境搭建之HomeStead
开发laravel,官方推荐使用HomeStead虚拟环境进行搭建. Linux: 1. 安装virtualbox(https://www.virtualbox.org/) 1)可以找到可供下载的镜像 ...
- .NET Core 异步(Async)底层原理浅谈
简介 多线程与异步是两个完全不同的概念,常常有人混淆. 异步 异步适用于"IO密集型"的场景,它可以避免因为线程等待IO形成的线程饥饿,从而造成程序吞吐量的降低. 其本质是:让线程 ...
- scikit-learn中的Pipeline:构建高效、可维护的机器学习流程
我们使用scikit-learn进行机器学习的模型训练时,用到的数据和算法参数会根据具体的情况相应调整变化, 但是,整个模型训练的流程其实大同小异,一般都是加载数据,数据预处理,特征选择,模型训练等几 ...
- 鸿蒙UI开发快速入门 —— part07:组件状态管理之@Prop/@Link装饰器
1.前言 我们在上一章学习了@State装饰器,@State装饰器的作用范围仅仅在当前组件,接下来,我们讨论如何从父组件中传入参数到子组件,让子组件随着父组件的状态发生变化.本章将要介绍的就是:@Pr ...
- ESP32网页示波器+波形发生器
项目开源地址:https://github.com/guohaomeng/ESP32WebScope ESP32WebScope 只用一块ESP32制作的ESP32网页示波器+波形发生器,可以拿来生成 ...
- 云数据备份 | CDN 日志备份最佳实践
前言 内容分发网络(Content Delivery Network,CDN),是在现有 Internet 中增加的一层新的网络架构,可以有效降低用户访问延迟,提升可用性. CDN 按照小时粒度对 ...
- 助推乡村振兴,四川农担X中电金信大数据智能风控平台彰显“榜样的力量”
在2024年3月召开的两会上,政府工作报告首次提到了要大力发展科技金融.绿色金融.普惠金融.养老金融.数字金融,为深入推进金融高质量发展,走中国特色金融发展之路指明了方向.其中,四川农担作为一家专注 ...
- 【Rive】Android与Rive交互
1 Android与Rive交互的常用接口 1.1 RiveAnimationView参数 <app.rive.runtime.kotlin.RiveAnimationView android: ...