<在线等>谁能详细的讲解一下垃圾回收

abrianna 2010-07-23 05:28:05
着急要看看,手上纸张的书给别人拿走了,入门经典、高级编程这些书的电子版对内存管理,垃圾回收介绍也是很泛泛的,谁能给个连接详细讲解的,msdn连接都成,我没搜索到比较好的。或是能直接敲给我,那不胜感激。在线等,结贴快。yeah
...全文
213 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
xupeihuagudulei 2010-07-24
  • 打赏
  • 举报
回复
via c#框架设计里面讲的很清楚了
LAIER903 2010-07-24
  • 打赏
  • 举报
回复
我想问这种自动垃圾回收有和优又有何弊?
自由_ 2010-07-24
  • 打赏
  • 举报
回复
学习
接受新东西
收下
abrianna 2010-07-24
  • 打赏
  • 举报
回复
感谢各位的耐心和热心。
提供书名的朋友能否给个连接下载。c#框架设计这书有的,但被别人借走了,via c#这书貌似只有英文版PDF的下载?
不要回帖让我买书了,有纸张版的基本,基本够了,不过都不在手边,这周末想找来看看,楼上各位给的连接和文字,都非常好。明天结贴。再次感谢,如果能有电子书的下载地址就更好了。
poloyzhang 2010-07-24
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 blogtjf 的回复:]

C# code
C# 使用自动内存管理,它使开发人员不再需要以手动方式分配和释放由对象占用的内存。自动内存管理策略由垃圾回收器实现。一个对象的内存管理生存周期如下所示:

当创建对象时,将为其分配内存,运行构造函数,该对象被视为活对象。
如果该对象或它的任何部分在后续执行过程中不再可能被访问了(除了运行它的析构函数),则该对象被视为不再被使用,可以销毁。C# 编译器和垃圾回收器可以通过分析……
[/Quote].
jackyzsy2008 2010-07-24
  • 打赏
  • 举报
回复
yanele 2010-07-24
  • 打赏
  • 举报
回复
路过,帮顶!
DYFDWX 2010-07-24
  • 打赏
  • 举报
回复
学习。。。
帮顶。。。
xy325432 2010-07-24
  • 打赏
  • 举报
回复
学习。。。
帮顶。。。
宇峰科技 2010-07-24
  • 打赏
  • 举报
回复
C# 使用自动内存管理,它使开发人员不再需要以手动方式分配和释放由对象占用的内存。自动内存管理策略由垃圾回收器实现。一个对象的内存管理生存周期如下所示: 

当创建对象时,将为其分配内存,运行构造函数,该对象被视为活对象。
如果该对象或它的任何部分在后续执行过程中不再可能被访问了(除了运行它的析构函数),则该对象被视为不再被使用,可以销毁。C# 编译器和垃圾回收器可以通过分析代码,确定哪些对象引用可能在将来被使用。例如,如果范围内的某个局部变量是现有的关于此对象的唯一的引用,但在当前执行点之后的任何后续执行过程中,该局部变量都不再可能被引用,那么垃圾回收器可以(但不是必须)认为该对象不再被使用。
一旦对象符合销毁条件,在稍后某个时间将运行该对象的析构函数(第 10.12 节)(如果有的话)。除非被显式调用所重写,否则对象的析构函数只运行一次。
一旦运行对象的析构函数,如果该对象或它的任何部分无法由任何可能的执行继续(包括运行析构函数)访问,则该对象被视为不可访问,可以回收。
最后,在对象变得符合回收条件后,垃圾回收器将释放与该对象关联的内存。
垃圾回收器维护对象的使用信息,并利用此信息做出内存管理决定,如在内存中的何处安排一个新创建的对象、何时重定位对象以及对象何时不再被使用或不可访问。

与其他假定存在垃圾回收器的语言一样,C# 也被设计成使垃圾回收器可以实现广泛的内存管理策略。例如,C# 并不要求一定要运行析构函数,不要求对象一符合条件就被回收,也不要求析构函数以任何特定的顺序或在任何特定的线程上运行。

垃圾回收器的行为在某种程度上可通过类 System.GC 的静态方法来控制。该类可用于请求执行一次回收操作、运行(或不运行)析构函数,等等。

由于垃圾回收器在决定何时回收对象和运行析构函数方面可以有很大的选择范围,它的一个符合条件的实现所产生的输出可能与下面的代码所显示的不同。程序

using System;
class A
{
~A() {
Console.WriteLine("Destruct instance of A");
}
}
class B
{
object Ref;
public B(object o) {
Ref = o;
}
~B() {
Console.WriteLine("Destruct instance of B");
}
}
class Test
{
static void Main() {
B b = new B(new A());
b = null;
GC.Collect();
GC.WaitForPendingFinalizers();
}
}
创建类 A 的一个实例和类 B 的一个实例。当给变量 b 赋值 null 后,这些对象变得符合垃圾回收条件,这是因为从此往后,任何用户编写的代码不可能再访问这些对象。输出可以为

Destruct instance of A
Destruct instance of B


Destruct instance of B
Destruct instance of A
这是因为该语言对于对象的垃圾回收顺序没有强加约束。

在微妙的情况中,“符合销毁条件”和“符合回收条件”之间的区别非常重要。例如,

using System;
class A
{
~A() {
Console.WriteLine("Destruct instance of A");
}
public void F() {
Console.WriteLine("A.F");
Test.RefA = this;
}
}
class B
{
public A Ref;
~B() {
Console.WriteLine("Destruct instance of B");
Ref.F();
}
}
class Test
{
public static A RefA;
public static B RefB;
static void Main() {
RefB = new B();
RefA = new A();
RefB.Ref = RefA;
RefB = null;
RefA = null;
// A and B now eligible for destruction
GC.Collect();
GC.WaitForPendingFinalizers();
// B now eligible for collection, but A is not
if (RefA != null)
Console.WriteLine("RefA is not null");
}
}
在上面的程序中,如果垃圾回收器选择在 B 的析构函数之前运行 A 的析构函数,则该程序的输出可能是:

Destruct instance of A
Destruct instance of B
A.F
RefA is not null
请注意,虽然 A 的实例被当作“没有被使用”,并且 A 的析构函数已被运行过了,但仍可能从其他析构函数调用 A 的方法(此例中是指 F)。还请注意,运行析构函数可能导致对象再次从主干程序中变得可用。在此例中,运行 B 的析构函数导致了先前没有被使用的 A 的实例变得可从当前有效的引用 Test.RefA 访问。调用 WaitForPendingFinalizers 后,B 的实例符合回收条件,但由于引用 Test.RefA 的缘故,A 的实例不符合回收条件。

为了避免混淆和意外的行为,好的做法通常是让析构函数只对存储在它们对象本身字段中的数据执行清理,而不对它所引用的其他对象或静态字段执行任何操作。
请叫我卷福 2010-07-24
  • 打赏
  • 举报
回复
对比一下 C++ 和 C# 就知道了。。。
  • 打赏
  • 举报
回复
有一点提醒楼主注意:“纸上得来终觉浅”。任何技术如果不是自己动手做过,理解都是很浅的。
amandag 2010-07-24
  • 打赏
  • 举报
回复
C#高级编程、框架设计第二版 都有详细的介绍
liwenguang_2009 2010-07-23
  • 打赏
  • 举报
回复
let me see see.
无所依赖 2010-07-23
  • 打赏
  • 举报
回复
学习来了
doubleu2005 2010-07-23
  • 打赏
  • 举报
回复
学习了
cuike519 2010-07-23
  • 打赏
  • 举报
回复
几个重要的概念了解:
1、代
2、根
3、引用
4、大对象堆

对象的新旧程度基本上用代来描述。存在根的对象就不是垃圾,反之就是垃圾。大对象堆是一个独立的区域,用来存放80K以上的对象,此堆不压缩,0-2代的内存会根据垃圾回收的算法进行内存压缩。

GC是一个由CLR来运行和管理的内存管理器用来管理托管堆,GC假设内存无限大,对象在这片内存上的分配是连续的(有点栈的意思)。当达到垃圾回收的条件时触发垃圾回收线程来回收线程,此时其他的线程为挂起状态。垃圾回收触发的条件一般为:手工调用GC.Collect方法,内存使用量超过了托管堆的大小需要再次向操作系统申请内存,或者操作系统的内存太低等。
wuyq11 2010-07-23
  • 打赏
  • 举报
回复
GC的全称是garbage collection,中文名称垃圾回收,是.NET中对内存管理的一种功能。垃圾回收器跟踪并回收托管内存中分配的对象,定期执行垃圾回收以回收分配给没有有效引用的对象的内存。当使用可用内存不能满足内存请求时,GC会自动进行。
http://msdn.microsoft.com/zh-cn/magazine/ee309515.aspx
moonwrite 2010-07-23
  • 打赏
  • 举报
回复
《你必须知道的.NET》 讲的很清楚
+1

新中级别 暂时没有必要深入了解
youth 2010-07-23
  • 打赏
  • 举报
回复
http://www.builder.com.cn/2008/0215/736586.shtml
加载更多回复(5)

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧