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();
  • 相关阅读:
    算法,折半查找--javascript版
    选择排序---堆排序算法(Javascript版) 降序排列
    常用的js正则总结
    前端工作流,集成解决方案,国内值得研究的
    gulp构建项目踩坑实战
    svg图片自适应div容器大小
    coffeeScript学习小结
    javascript正则匹配中文
    android开发中R文件丢失
    MySql 5.7密码查看或修改
  • 原文地址:https://www.cnblogs.com/fuGuy/p/5648734.html
Copyright © 2011-2022 走看看