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

Dotnet程序的内存与垃圾回收

时间:2023-01-07 22:33:08浏览次数:42  
标签: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();

网上说这里做了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#里把好多内存分配相关的弱化了 感觉析构函数差不多成摆设了。

 

标签:Random,回收,GC,内存,Dotnet,new,Class3,垃圾
From: https://www.cnblogs.com/assassinx/p/17033597.html

相关文章

  • 获取程序内存信息
    /***获取程序内存信息**@param*@return*/@org.junit.TestpublicvoidMemoryAction(){Runtimeruntime=Runtime.getRuntime();//获取Runtime对象实例 ......
  • CDH-内存挑拨过度验证阈值的解决方法
    1、问题描述hadoop应用程序或者Yarn的作业随机的出现OutOfMemory(OOM),在ClouderaManager界面显示如下警告:ip-172-31-24-169.ap-southeast-1.compute.internal:Memory......
  • p17常见的几种调用约定以及float型转化为内存存储格式
    常见的几种调用约定--cdecl(栈外平衡)--stdcall(内平栈)--fastcall找到main入口ctrl+n找到Getversion然后f8找3函数(3push1call)float型转化为内存存储格式8.258:100......
  • Qt浅谈之一:内存泄露(总结)(转)
    一、简介Qt内存管理机制:Qt在内部能够维护对象的层次结构。对于可视元素,这种层次结构就是子组件与父组件的关系;对于非可视元素,则是一个对象与另一个对象的从属关系......
  • CICD dotnet 自动化部署 jenkins+gitee
    问题描述:在Centos8系统中,使用dockerrun时,出现如下报错:EmulateDockerCLIusingpodman.Create/etc/containers/nodockertoquietmsg.Error:open/proc/self/uid_map......
  • MIT——6.828:操作系统工程——第2章:实验二:内存管理
    在本实验中,为操作系统编写内存管理代码,分为三个部分第一部分是物理内存管理,使得内核可以分配内存并稍后释放它。物理内存管理将以4096字节为单位运行,称为pages。这一部......
  • 逆向-内存
    一、寄存器与内存的区别:        计算机内存的每一个字节会有一个编号(即内存编号的单位是字节),如下图:  32位计算机的编号最大是32位,也就是32个1换......
  • 前端浅谈 - js的垃圾回收
    1.对于js来说什么是垃圾?    垃圾就是没用了的东西.emmm~~对于js来说,这种说法不是特别准确但是又特别贴切.占着内存但是又不被需要的变量被称为垃圾(有被内涵到).......
  • jvm内存模型
         老年代2/3堆   new新对象      新年代 1/3eden8/10surviors01/10s11/10栈   先进后出线程运行就会分配一个......
  • windows下gradle下使用windows版普罗米修斯prometheus和metrics简单的制作一个监控jav
    1.引入依赖(如果是maven可以自行翻译):例如:compile'io.prometheus:simpleclient_hotspot:0.5.0'groupid为io.prometheusartifactid为......