三代回收机制
为了提升垃圾回收的效率,微软做了很多的优化。一个很重要的功能就是三代回收机制。对于这个机制,GC做了一下几个假设:
- 越新的对象,生存周期会越短
- 越老的对象,生存周期会越长
- 新创建的对象,和其它对象关联性强越强,他被访问的频率越高
- 移动内存的一部分要比移动整个托管堆要快
当然,很多学者都认为这些假设在大多数情况下是正确的,因此我们下面来讨论一下这些假设怎样影响GC的。
当GC初始化的时候,托管堆没有任何对象。加到托管堆中的对象被认为是0代(Generation 0),你可以看到Figure2。0代的对象都是新的对象,并且没有被GC检查过的对象。
当GC执行回收的时候,所有没有被回收的对象会集中在堆栈的最底端。这些对象幸存了下来,是比较老的对象,因此被认为是1代(Generation 1)。Figure3
当更多的对象被创建的时候,这些新创建的对象被放在堆栈的顶端,作为0代。当GC被再次执行的时候,1代中幸存下来的对象变成了2代,0代幸存下来的变成1代。Figure4。这时候0代为空,新创建的对象为0代。
现在,2代是GC主机吃的最高代了,GC再次运行的时候,2代里面幸存的对象仍然是2代。
下面的代码是MSDN上的GC的demo
namespace GCCollectIntExample
{
class MyGCCollectClass
{
private const long maxGarbage = 1000;
static void Main()
{
MyGCCollectClass myGCCol = new MyGCCollectClass();
// Determine the maximum number of generations the system
// garbage collector currently supports.
Console.WriteLine("The highest generation is {0}", GC.MaxGeneration);
myGCCol.MakeSomeGarbage();
// Determine which generation myGCCol object is stored in.
Console.WriteLine("Generation: {0}", GC.GetGeneration(myGCCol));
// Determine the best available approximation of the number
// of bytes currently allocated in managed memory.
Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(false));
// Perform a collection of generation 0 only.
GC.Collect(0);
// Determine which generation myGCCol object is stored in.
Console.WriteLine("Generation: {0}", GC.GetGeneration(myGCCol));
Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(false));
// Perform a collection of all generations up to and including 2.
GC.Collect(2);
// Determine which generation myGCCol object is stored in.
Console.WriteLine("Generation: {0}", GC.GetGeneration(myGCCol));
Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(false));
Console.Read();
}
void MakeSomeGarbage()
{
Version vt;
for (int i = 0; i < maxGarbage; i++)
{
// Create objects and release them to fill up memory
// with unused objects.
vt = new Version();
}
}
}
}
运行结果
本文链接
AutoResetEvent 允许线程通过发信号互相通信。通常,此通信涉及线程需要独占访问的资源。
线程通过调用 AutoResetEvent 上的 WaitOne 来等待信号。如果 AutoResetEvent 处于非终止状态,则该线程阻塞,并等待当前控制资源的线程
通过调用 Set 发出资源可用的信号。
调用 Set 向 AutoResetEvent 发信号以释放等待线程。AutoResetEvent 将保持终止状态,直到一个正在等待的线程被释放,然后自动返回非终止
状态。如果没有任何线程在等待,则状态将无限期地保持为终止状态。
可以通过将一个布尔值传递给构造函数来控制 AutoResetEvent 的初始状态,如果初始状态为终止状态,则为 true;否则为 false。
通俗的来讲只有等myResetEven.Set()成功运行后,myResetEven.WaitOne()才能够获得运行机会;Set是发信号,WaitOne是等待信号,只有发了信号,
等待的才会执行。如果不发的话,WaitOne后面的程序就永远不会执行。
定义委托线程:
public delegate void AsyncDelegate();
try
{
AsyncDelegate dlgt1 = new AsyncDelegate(GetPolicyInfo);
IAsyncResult ar1 = dlgt1.BeginInvoke(null, null);
AsyncDelegate dlgt2 = new AsyncDelegate(GetFDPriceInfo);
IAsyncResult ar2 = dlgt2.BeginInvoke(null, null);
AsyncDelegate dlgt3 = new AsyncDelegate(LiuKouQuery);
IAsyncResult ar3 = dlgt3.BeginInvoke(null, null);
AsyncDelegate dlgt4 = new AsyncDelegate(PolicyCoordinationQuery);
IAsyncResult ar4 = dlgt4.BeginInvoke(null, null);
ar1.AsyncWaitHandle.WaitOne();
dlgt1.EndInvoke(ar1);
ar2.AsyncWaitHandle.WaitOne();
dlgt2.EndInvoke(ar2);
ar3.AsyncWaitHandle.WaitOne();
dlgt3.EndInvoke(ar3);
ar4.AsyncWaitHandle.WaitOne();
dlgt4.EndInvoke(ar4);
CombinePolicyAndPrice();
}
catch
{
}
finally
{
AutoResetEvent are = (AutoResetEvent)o;
are.Set();
}
本文链接
处男贴,写的不好,请多指教。
2 {
3 if (Dgv_Session.SelectionMode == DataGridViewSelectionMode.FullRowSelect)
4 {
5 int[] Num = new int[Dgv_Session.SelectedRows.Count];
6 for (int i = 0; i < Dgv_Session.SelectedRows.Count; i++)
7 {
8 Num[i] = Dgv_Session.SelectedRows[i].Index;
9 }
10 if (Num.Length > 0)
11 {
12 for (int i = Num.Length - 1; i >= 0; i--)
13 {
14 if (Num[i] <= 0)
15 {
16 return;
17 }
18 else
19 {
20 ArrayList al = new ArrayList();
21 for (int j = 0; j < _dt_session.Rows[Num[i]].ItemArray.Length; j++)
22 {
23 al.Add(_dt_session.Rows[Num[i]][j].ToString());
24 }
25 DataRow tempRow = _dt_session.NewRow();
26 for (int j = 0; j < al.Count; j++)
27 {
28 tempRow[j] = al[j];
29 }
30 _dt_session.Rows.InsertAt(tempRow, Num[i] - Num[Num.Length - 1]);
31 _dt_session.Rows.RemoveAt(Num[i] + 1);
32 Dgv_Session.ClearSelection();
33 Dgv_Session.Rows[0].Selected = true;
34 Dgv_Session.DataSource = _dt_session;
35 }
36 }
37 }
38 }
39 }
40
41 private void btn_MoveUp_Click(object sender, EventArgs e)
42 {
43 if (Dgv_Session.SelectionMode == DataGridViewSelectionMode.FullRowSelect)
44 {
45 int[] Num = new int[Dgv_Session.SelectedRows.Count];
46 for (int i = 0; i < Dgv_Session.SelectedRows.Count; i++)
47 {
48 Num[i] = Dgv_Session.SelectedRows[i].Index;
49 }
50 if (Num.Length > 0)
51 {
52 for (int i = Num.Length - 1; i >= 0; i--)
53 {
54 if (Num[i] <= 0)
55 {
56 return;
57 }
58 else
59 {
60 ArrayList al = new ArrayList();
61 for (int j = 0; j < _dt_session.Rows[Num[i]].ItemArray.Length; j++)
62 {