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_( ...
随机推荐
- Windows 杜比OEM授权
我们中高端的windows笔记本上都可以看到Dolby音效,TV电视上也有支持Dolby显示选项. 杜比主要有几类:Dolby全景声(也叫Atmos).Dolby视界(Vision).杜比影院(Dol ...
- WiFi基础(八):WiFi安全、认证与加密
liwen01 2024.11.17 前言 计算机网络在给人们带来便利的同时,也引入了安全风险,对于无线WiFi网络而言,风险更高.无线 WiFi 网络安全主要包括两大部分:接入认证和数据加密. 虽然 ...
- php-fpm常见错误
1. WARNING: Nothing matches the include pattern '/usr/local/php7/etc/php-fpm.d/*.conf' # cd /usr/loc ...
- 使用 JsonSchema 校验 JSON数据
有时候JSON 数据格式需要校验是否合法,我们可以使用 JsonSchema 来校验数据是否合法. 引入 pom.xml https://json-schema.org/ <dependency ...
- synchronized 关键字测试
对象上有关键字 package com.study.juc.sync; import java.util.concurrent.TimeUnit; public class Test1 { publi ...
- 在 IdentityServer4 中创建客户端
创建客户端 在创建了 IdentityServer4 服务器之后,我们可以准备从获取一个访问令牌开始. 1. 客户端凭证式验证流 在 OpenID Connect 中,最为简单的验证方式为客户端凭借方 ...
- 【Python自动化】selenium简单应用
准备工作 查询浏览器版本 chrome://version/ 下载驱动 https://chromedriver.storage.googleapis.com/index.html 下载的驱动版本要和 ...
- ArgoCD 简介
fork https://github.com/DevopsChina/lab/tree/main/deploy/lab04-argocd 1. ArgoCD 简介 基于 kubernetes 的声明 ...
- nginx jupyterWeb
location /jupyterWeb/ { add_header X-Frame-Options SAMEORIGIN; add_header Access-Control-Allow-Origi ...
- Qt/C++音视频开发63-设置视频旋转角度/支持0-90-180-270度旋转/自定义旋转角度
一.前言 设置旋转角度,相对来说是一个比较小众的需求,如果视频本身带了旋转角度,则解码播放的时候本身就会旋转到对应的角度显示,比如手机上拍摄的视频一般是旋转了90度的,如果该视频文件放到电脑上打开,一 ...