垃圾收集器概述

  大排档和学校食堂。一个是别人帮你收拾盘子,一个是自己收拾盘子。

  垃圾收集GCGarbage Collection。内存的分配、回收不需要程序员操心,程序员只要需要的时候new就可以,用完了不用管,有人帮你清除不用的内存。这个人就是“垃圾收集器”。.Net程序员一般不用像C++程序员那样处理内存的申请和回收,是因为有GC

GC优点:程序员不用关心内存的申请和回收,缺点:不用的内存不能立即得到回收(GC并不会实时去回收不用的内存,而是找时机才回收)。

  当对象一定不再有用的时候GC就可以将对象回收了(悲观!)。判断一个对象是否一定不再有用的标准就是没有任何的变量指向它。当一个变量设置为null的时候。

 Person p1=new Person(“lilei”);//在内存中创建了Person对象
Person p2 = p1;//把p2指向p1指向的对象!这一刻p1指向着leilei,p2就顺着p1找到了lilei
p1=null;//p1不再指向lilei 。lilei不能回收,因此p2还在指着它
p2= new Person(“hanmeimei”);//lilei可以回收,因为p2已经指向了另外一个对象,此时再也没有任何变量指着它。
--------------------------------------------------------------------------------------------------------------------------
DataSet ds1 = new dataset();
ds2=ds1;
ds1=null;
ds2=null;//new dataset()的对象已经悬空,没有任何变量能再指向它,他就不能再用了 --------------------------------------------------------------------------------------------------------------------------
void Main() {
Person p1 = new Person();
p2 = p1;//让p2指向p1指向的对象。
Console.WriteLine("hello");
p1.SayHello();
p1=null;// p1指向的对象不可以被回收,因为还有p2指向它
p2=null;//可以被回收,没有任何对象指向它
p3=...
}
--------------------------------------------------------------------------------------------------------------------------
void Hello() {
Person p1 = new Person();
p1.SayHello();
}//出了Hello,p1指向的对象就可以被回收了
private Person myp;
void Hello1() {
Person p1 = new Person();
p1.Sayhello();
myp=p1;
}
//出了hello1,p1指向的对象还不会被回收。因为还有myp指向它

  当一个对象一旦被最后一个指向它的变量抛弃的时候(“变量=null”或者变量出了作用域),不可能再有任何变量指向它,它就像断了线的风筝,再也飞不回来了,因此就可以被回收了。当一个对象找不回来的时候就可以被GC了。

垃圾收集GC其他说明

不会再被使用的内存(对象)就是垃圾。

对象可以被回收不一定会立即回收,GC就像清洁工,不是有了垃圾就去清扫,否则GC累,而且清扫垃圾就影响系统的正常工作(服务员收盘子的时候都会影响旁边的人吃饭)。频繁的GC(垃圾回收)造成系统性能下降,不是有了垃圾就清理。垃圾收集器会找一个合适的时机去回收。

GC.Collect();//服务员,收一下!就会立即进行内存的回收了

GC类中提供了对GC进行控制、监测的方法,比如GC.Collect()可以强制立即开始进行GC,但是一般不要去手动干预GC。没有特殊理由,不要去调用GC.Collect(),让.net自己决定什么时候去回收内存。

WeakReference,通过WeakReference来引用一个对象就可以知道引用的对象是否还活着,即有没有被GC回收,WeakReference就相当于一本生死簿,记录着指向的对象的生死。

 Person p1 = new Person();
WeakReference wr = new WeakReference(p1);//弱引用
wr.IsAlive;// 判断指向的对象是否还活着

注意:GC只能回收托管(Managed)内存资源,对于数据库连接、文件句柄、Socket连接等这些资源(非托管资源,UnManaged)就无能为力,必须程序员自己控制资源的回收。非托管资源:SqlConnection、FileStream等。

sqlconnection也是在net里创建的,为什么就和别的不一样呢,new Person()只是占用对象的内存资源,而new sqlconnection()则除了占用内存资源,还占用了一个到数据库的连接资源,这个是GC管不了的。如果conn不用了,没有Dispose,那么conn对象占用的内存也会被回收,但是数据库连接资源不会。

垃圾收集器测试代码:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace GC垃圾回收器
{
class Program
{
static void Main(string[] args)
{
Person p1 = new Person();
WeakReference wr = new WeakReference(p1);//弱引用
p1 = null;//p1设置为null之后,此时已经没有任何变量指向Person对象了,此时Person对象就等着被GC回收了
Console.WriteLine("我是Person1对象,我还活着吗,WeakReference(生死簿)上显示说是:" + (wr.IsAlive ? "Yes" : "NO"));//判断指向的对象是否还活着
GC.Collect();//调用垃圾回收器回收那些没有任何变量指向的对象了,不写可能IsAlive还为true
Console.WriteLine("我是Person1对象,我还活着吗,WeakReference(生死簿)上显示说是:" + (wr.IsAlive ? "Yes" : "NO"));//判断指向的对象是否还活着
Console.WriteLine("================================================");
//通过WeakReference来引用一个对象就可以知道引用的对象是否还活着,即有没有被GC回收
//WeakReference就相当于一本生死簿,记录着指向的对象的生死
WeakReference wr1 = null;
Person p2 = new Person();
wr1 = new WeakReference(p2);
Console.WriteLine("我是Person2对象,我还活着吗,WeakReference(生死簿)上显示说是:" + (wr1.IsAlive ? "Yes" : "NO"));//判断指向的对象是否还活着
GC.Collect();//调用垃圾回收器回收那些没有任何变量指向的对象了,不写可能IsAlive还为true
Console.WriteLine("我是Person2对象,我还活着吗,WeakReference(生死簿)上显示说是:" + (wr1.IsAlive ? "Yes" : "NO"));//判断指向的对象是否还活着
Console.ReadKey();
}
}
class Person { }
}

运行效果:

.Net高级技术——垃圾收集器的更多相关文章

  1. jvm系列(三):java GC算法 垃圾收集器

    GC算法 垃圾收集器 概述 垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了. jvm 中,程序计 ...

  2. GC之一--GC 的算法分析、垃圾收集器、内存分配策略介绍

    一.概述 垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了. jvm 中,程序计数器.虚拟机栈.本 ...

  3. GC算法 垃圾收集器

    GC算法 垃圾收集器 参考:http://www.cnblogs.com/ityouknow/p/5614961.html 概述 垃圾收集 Garbage Collection 通常被称为“GC”,它 ...

  4. Java GC算法 垃圾收集器

    GC算法 垃圾收集器 概述 垃圾收集 Garbage Collection 通常被称为"GC",它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了. ...

  5. 深入理解Java虚拟机 第三章 垃圾收集器 笔记

    1.1   垃圾收集器 垃圾收集器是内存回收的具体实现.以下讨论的收集器是基于JDK1.7Update14之后的HotSpot虚拟机.这个虚拟机包含的所有收集器有: 上图展示了7种作用于不同分代的收集 ...

  6. 《深入理解Java虚拟机》-----第3章 垃圾收集器与内存分配策略

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来. 3.1 概述 说起垃圾收集(Garbage Collection,GC),大部分人都把这 ...

  7. Java虚拟机—垃圾收集器(整理版)

    1.概述 如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现.Java虚拟机规范中对垃圾收集器应该如何实现并没有规定,因此不同的厂商.不同版本的虚拟机所提供的垃圾收集器都可能会有很 ...

  8. 《深入java虚拟机》读书笔记之垃圾收集器与内存分配策略

    前言 该读书笔记用于记录在学习<深入理解Java虚拟机--JVM高级特性与最佳实践>一书中的一些重要知识点,对其中的部分内容进行归纳,或者是对其中不明白的地方做一些注释.主要是方便之后进行 ...

  9. Java虚拟机(二):Java GC算法 垃圾收集器

    概述 垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了. jvm 中,程序计数器.虚拟机栈.本地方 ...

随机推荐

  1. TImage 显示 资源中 的图片、TResourceStream、资源文件

    unit Unit5; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System ...

  2. 下载Eclipse

    工欲善其事必先利其器,我们学习Java首先要学会下载开发工具,Eclipse就是一个很好的Java语言开发工具,那么我们首先要知道怎么下载Eclipse.相信很多Java书籍都有下载Eclipse的教 ...

  3. AndroidStudio3.0到3.1遇到的坑

    原文:https://blog.csdn.net/qq_36676433/article/details/80361064 本以为3.0到3.1仅仅是界面的优化,万万没想到的是这个坑比起2.0到3.0 ...

  4. java8 - 2

    import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; import java.util. ...

  5. 【LOJ】#2061. 「HAOI2016」放棋子

    题解 水题,可惜要写高精度有点烦 一看障碍物的摆放方式和最后的答案没有关系,于是干脆不读了,直接二项式反演可以得到 设\(g_k\)为一种摆放方式恰好占了k个障碍物 \(f_k = \sum_{i = ...

  6. HTTP.Socket.TCP详解

    这会没事,整理了一下HTTP,socket,TCP之间的关系与区别,我们在面试的时候应该会经常问到这方面的东西,那么什么是HTTP呢? HTTP属于老话题了,在项目中我们经常需要往服务端发POST或者 ...

  7. C# 中从网络上下载文件保存到本地文件

    下面是C#中常用的从Internet上下载文件保存到本地的一些方法,没有太多的技巧. 1.通过  WebClient  类下载文件 WebClient webClient = new WebClien ...

  8. Leaving Auction CF 749D

    题目:http://codeforces.com/problemset/problem/749/D 题目大意: 有n个人竞拍,也有n个叫牌,一个人可以有多个叫价牌,但也可能有一些人根本不叫价 每个叫牌 ...

  9. 【基础知识】.Net基础加强第三天

    一. 里氏替换原则--类型转换 1. 里氏替换原则:当需要一个父类类型对象的时候,可以给一个子类类型的对象. 2. 里氏替换原则实际也就是发生了隐身转换 3.  a.>把子类类型赋值给父类类型, ...

  10. android viewHolder static 静态

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 不是静态内部类 会 持有 外部类的 引用.  就像经常自定义的 适配器 类 作为内部类 ...