首页 > 系统相关 >Dotnet程序的内存与垃圾回收

Dotnet程序的内存与垃圾回收

时间:2023-01-27 18:10:31浏览次数:46  
标签:Random 回收 GC 内存 Dotnet new Class3 垃圾

都知道程序运行时的变量是放在内存里的,从我们学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();

Dotnet程序的内存与垃圾回收_List

Dotnet程序的内存与垃圾回收_析构函数_02

网上说这里做了c1=null后 立即就会触发回收,纯属是扯淡,这个完全是未知的, 但是调用GC.Collect()呢基本上呢确实至多第二次就会触发回收。但是如果我没把GC.Collect()去掉呢让其发展呢,这就要看心情了,有时候很久都不会有什么动作c1=null这句要不要都一样。根据数组大小我这边的运行情况基本上存储4组大概76M就会进行回收。如果有引用把对象挂着呢,当然 就不会进行回收,那么最大可以存多少呢?我这边特意把配置设为32位的情况下大概1.14Gb的时候就会溢出。

Dotnet程序的内存与垃圾回收_垃圾回收_03

Dotnet程序的内存与垃圾回收_析构函数_04

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 }

Dotnet程序的内存与垃圾回收_垃圾回收_05

 

如果是x64则上不封顶,注意 内存的增长体现在红框处,满了后会自动继续扩,会超出实际物理内存。由于Windows系统是虚拟内存机制,内部进行了一些玄妙的处理咱也不了解。不管咋样对应程序来说当成正常区域访问。

Dotnet程序的内存与垃圾回收_List_06

通过上面的测试可以验证垃圾回收的机制基本上还是按照我们常规理解的套路去运作的的。 C++ 的时候要很谨慎 一层一层的 调用了new 一定别忘了delete 然后析构函数里也是一样。C#里把好多内存分配相关的弱化了 感觉析构函数差不多成摆设了。

 



标签:Random,回收,GC,内存,Dotnet,new,Class3,垃圾
From: https://blog.51cto.com/u_9571691/6024162

相关文章

  • AndroidBench&eMMC内存测试速度&Android
    提问: 问题:手机eMMC内存,我用AndroidBench/安兔兔/鲁大师测出来的速度很快,而自己写AndroidTool测试的速度确很慢,这是为什么呢?主要信息:   同样是SequenceWrite操作,An......
  • SQLServer 2014 内存优化表
    内存优化表是SQLServer2014的新功能,它是可以将表放在内存中,这会明显提升DML性能。关于内存优化表,更多可参考两位大侠的文章:​​SQLServer2014新特性探秘(1)-内存数据库......
  • 监控Python 内存使用情况和代码执行时间
    我的代码的哪些部分运行时间最长、内存最多?我怎样才能找到需要改进的地方?”在开发过程中,我很确定我们大多数人都会想知道这一点,而且通常情况下存在开发空间。在本文中总结......
  • C++Day12 虚拟继承内存布局测试
    测试一、虚继承与继承的区别1.1单个继承,不带虚函数1>classBsize(8):1>+---1>0|+---(baseclassA)1>0||_ia//4B1......
  • 类加载内存分析
       ......
  • 三种初始化及内存分析
    三种初始化及内存分析代码packagecom.zhan.base04Array;publicclassTest03{publicstaticvoidmain(String[]args){//数组的静态初始化:......
  • 求一个整数储存在内存中的二进制1的个数
    #include<stdio.h>intmain(){//统计num补码中有几个1intnum=0;intcount=0;scanf("%d",&num);inti=0;for(i=0;i<32;i++){//按位与-......
  • 编写代码实现:求一个整数存储在内存中的二进制中1的个数
    目的:统计num的补码中有几个1法一#include<stdio.h>intmain(){intnum=0;intcount=0;scanf("%d",&num);//3--011//二进制:模2除2while(num)//因为二进制只有0和1,......
  • 内存区域
       ......
  • G1 垃圾收集器参数
    1.G1垃圾收集器是在1.74u版本加入(由Oracle加入),jdk1.8中默认的还是CMS垃圾收集器(CMS在jdk14中被废弃,在jdk11中),如果jdk8想使用G1收集器需要手动调参 ......