静态与垃圾回收机制

静态Static使用

  1.  用在类里的属性、方法前面,这样的静态属性与方法不需要创建实例就能访问,通过类名或对象名都能访问它,静态属性、方法只有“一份”:即如果一个类新建有N个对象,这N 个对象只有同一个静态属性与方法;

  2. 方法内部的静态变量:方法内部的静态变量,执行完静态变量值不消失,再次执行此对象的方法时,值仍存在,它不是在栈中分配的,是在静态区分析的, 这是与局部变量最大的区别;

  3. 一个类中如果存在静态构造函数,当程序运行时静态构造函数只执行一次;

  4. 与多态背道而驰,静态不允许实例化。
 1                              
 2  using System;
 3  
 4 namespace teststatic1
 5 {
 6     class TestClass
 7     {
 8         static int i = getNumber();
 9         int j = getNumber();
10  
11         static int num = 1;
12         
13         static int getNumber()
14         {
15             return num;
16         }
17  
18         static void Main(string[] args)
19         {
20             Console.WriteLine("i={0}",i);
21             Console.WriteLine("j={0}", new TestClass().j);
22             Console.ReadKey();
23         }
24     }
25 }     
26                     
View Code

当执行第一个Console.ReadLine("i={0}",i);因为这里i是static变量,而且类class1是第一次被引 用,要先为TestClass里面所有的static变量分配内存。指令在逻辑还是一条一条的按顺序执行的,所以 先为static int i分配内存,并且在该内存中保持int的缺省值0,接着再为static int num 变量分配内存,值当然也为0。

然后执行第二步,为变量赋值:先为static int i变量赋值,i=getNumber(),看getNumber里面的代码,就是return num,这个时候num的值是0,于是i就为0了。然后对变量num赋值,num=1;这行代码执行后,num就为1了。 

垃圾回收器

  1. 垃圾回收器回收什么?
  2. 什么东西能被垃圾回收器回收?
  3. 何时回收?

   垃圾回收器何时回收的时间不确定,我们不知道它何时回收,但可以确定当我们使用的时候不可能进行回收。只有当我们程序里的一个变量长时间不用的时候,比如person p=new person(); p=null;这就标志垃圾回收器可以进行垃圾回收了,但也不知道垃圾回收器何时对垃圾进行回收。如果我们先让垃圾回收器立即对该变量在堆栈中开的空间马上回收,我们可以调用GC.Collect()马上对该变量进行回收。

    垃圾回收 GC 类提供 GC.Collect 方法,您可以使用该方法让应用程序在一定程度上直接控制垃圾回收器。通常情况下,您应该避免调用任何回收方法,让垃圾回收器独立运行。在大多数情况下,垃圾回收器在确定执行回收的最佳时机方面更有优势。但是,在某些不常发生的情况下,强制回收可以提高应用程序的性能。当应用程序代码中某个确定的点上使用的内存量大量减少时,在这种情况下使用 GC.Collect 方法可能比较合适。例如,应用程序可能使用引用大量非托管资源的文档。当您的应用程序关闭该文档时,您完全知道已经不再需要文档曾使用的资源了。出于性能的原因,一次全部释放这些资源很有意义。

 1             Human h= new Human ();
 2             h.Name = “sb";
 3             WeakReference wrf = new WeakReference(h);
 4             h= null;
 5            // GC.Collect();
 6             object o = wrf.Target;
 7             if (o!=null)
 8             {
 9                 Human h = o as Human;
10                 Console.WriteLine(h.Name);
11             }
12             else
13             {
14                 Console.WriteLine("只能重新创建了");
15             }
16             Console.ReadKey();

垃圾回收的目的:提高内存利用率。
垃圾回收器,只回收托管堆中的内存资源,不回收其他资源(数据库连接、文件句柄、网络端口等)。
什么样的对象才会被回收?
没有变量引用的对象。没有变量引用的对象,表示可以被回收了(null),断了线的风筝,再也回不来了。
大学食堂(自己收盘子)、大排档(不需要程序员自己收盘子)

什么时间回收?

无法确定垃圾被回收的时间,当程序需要新内存的时候开始执行回收。
GC.Collect();//手动调用垃圾回收器。不建议使用,垃圾回收时会暂停一下(非常短暂)让程序自动去GC。

垃圾回收器中是以代进行划分的

垃圾回收器中“代”的概念:
共3代:第0代、第1代、第2代。
各代的回收频率:第0代最高,其次第1代,再次第2代。也就是说越老的对象生存几率越大。
.net中垃圾回收机制:mark-and-compact(标记和压缩),一开始假设所有对象都是垃圾。
除了内存资源外的其他资源怎么办?~或者Dispose();
弱引用:WeakReference,对于创建比较耗时的对象可以使用弱引用。
IsALive判断是否已死。
“大对象”,object o=new byte[85000];>=85000字节的对象被视为大对象,直接分配在第2代,GC.GetGeneration(o);不要为为短时间使用的对象创建大对象,否则频繁回收第2代。

 1        Human h= new Human ();
 2             h.Name = "yzk";
 3             WeakReference wkr = new WeakReference(h);
 4             h= null;
 5             //手动调用垃圾回收器。
 6             //GC.Collect();
 7             object o = wkr.Target;
 8        //IsAlive
 9             if (o != null)
10             {
11                 Console.WriteLine(((Person)o).Name);
12             }
13             else
14             {
15                 Console.WriteLine("对象已经被回收!");
16             }
17             Console.ReadKey();
原文地址:https://www.cnblogs.com/fuGuy/p/5648734.html