zoukankan      html  css  js  c++  java
  • 静态与垃圾回收机制

    静态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();
  • 相关阅读:
    PAT (Advanced Level) 1010. Radix (25)
    PAT (Advanced Level) 1009. Product of Polynomials (25)
    PAT (Advanced Level) 1008. Elevator (20)
    PAT (Advanced Level) 1007. Maximum Subsequence Sum (25)
    PAT (Advanced Level) 1006. Sign In and Sign Out (25)
    PAT (Advanced Level) 1005. Spell It Right (20)
    PAT (Advanced Level) 1004. Counting Leaves (30)
    PAT (Advanced Level) 1001. A+B Format (20)
    PAT (Advanced Level) 1002. A+B for Polynomials (25)
    PAT (Advanced Level) 1003. Emergency (25)
  • 原文地址:https://www.cnblogs.com/fuGuy/p/5648734.html
Copyright © 2011-2022 走看看