名词

垃圾收集目标

  • ephemeral GC

发生在Gen 0 和Gen 1 的垃圾收集

  • Full GC

发生Gen 2 及以上的Gen与LOH的垃圾收集

垃圾收集模式

  • 工作站模式

GC直接发生在内存分配的线程(也是当前的工作托管线程)上

  • 服务器模式

每个CPU核都有一个自己独立的GC线程与托管堆

垃圾收集的并发需求

  • 并发的意思是background GC在进行垃圾收集时,其它托管线程是否可以同时工作(包括分配内存)
  • 仅需为Full GC考虑并发,因为ephemeral GC的时间短、代价小,可一直为阻塞模式。
  • .NET4后的并发可让background GC与ephemeral GC同时工作

配置

<configuration>
<runtime>
<gcConcurrent enabled="true"/>
<gcServer enabled="true"/>
</runtime>
</configuration>

继承与垃圾回收模型

using System;

namespace 继承与垃圾回收模型 {
class Base : IDisposable {
private bool _disposed; protected virtual void Dispose(bool disposing) {
Console.WriteLine(string.Format("Base.Dispose({0})", disposing));
if (!_disposed) {
if (disposing) {
#region 清理Base自己的托管资源
#endregion
}
#region 清理Base自己的非托管资源
#endregion
}
_disposed = true;
} public void Base干活() {
if (_disposed) {
throw new ObjectDisposedException("Base");
}
} ~Base() {
Console.WriteLine("~Base()");
Dispose(false);
} public void Dispose() {
Console.WriteLine("");
Dispose(true);
GC.SuppressFinalize(this);
}
} class Child : Base {
private bool _disposed; protected override void Dispose(bool disposing) {
Console.WriteLine(string.Format("Child.Dispose({0})", disposing));
if (!_disposed) {
try {
if (disposing) {
#region 清理Child自己的托管资源
#endregion
}
#region 清理Child自己的非托管资源
#endregion
_disposed = true;
}
finally {
base.Dispose(disposing);
}
}
} public void Child干活() {
if (_disposed) {
throw new ObjectDisposedException("爸爸");
}
} //“可以”为Child写析构方法,但没必要。内部的“Dispose(false)”也没必要
~Child() {
Console.WriteLine("~Child()");
}
} class 回收示例 {
/// <summary>
/// 输出:
/// -----以下为手动回收
/// Child.Dispose(True)
/// Base.Dispose(True)
///
/// -----以下为自动回收
/// ~Child()
/// ~Base()
/// Child.Dispose(False)
/// Base.Dispose(False)
/// </summary>
/// <param name="args"></param>
static void Main(string[] args) {
Console.WriteLine("-----以下为手动回收");
var 手动 = new Child();
手动.Dispose(); Console.WriteLine("/n/n-----以下为自动回收");
var 自动 = new Child();
GC.Collect();
}
}
}

  

资料

实现 Dispose 方法

垃圾回收通知

.Net Discovery 系列之七--深入理解.Net垃圾收集机制(拾贝篇) 发布在新年第一秒

.Net Discovery 系列之四--深入理解.Net垃圾收集机制(下)

So, what’s new in the CLR 4.0 GC?      
    .NET 4/4.5里新的垃圾收集机制      
    对象代(Generation)与GC      
    Using GC Efficiently – Part 2      
    CLR探索系列:Server and Workstation Garbage Collection探索(垃圾回收系列)

.NET垃圾回收笔记的更多相关文章

  1. JAVA垃圾回收笔记

    一.分析GC日志 /** * @author : Hejinsheng * @date : 2019/1/18 0018 * @Description: 模拟FULL GC/YOUNG GC * -X ...

  2. Java内存模型与垃圾回收笔记

    内存模型 栈. 局部变量(基本类型)与对象引用:线程隔离.每个方法执行时会创建一个栈帧,存储局部变量等. 堆. 对象实例:线程共享. 方法区.类信息.常量(final).静态变量.符号引用: 线程共享 ...

  3. python 垃圾回收笔记

    目录 引用计数 python内部的引用计数机制 循环引用 调试内存泄漏 总结 python 程序在运行的时候,需要在内存中开辟出一块空间,用于存放运行时产生的临时变量:计算完成后,再将结果输出到永久性 ...

  4. 0030 Java学习笔记-面向对象-垃圾回收、(强、软、弱、虚)引用

    垃圾回收特点 垃圾:程序运行过程中,会为对象.数组等分配内存,运行过程中或结束后,这些对象可能就没用了,没有变量再指向它们,这时候,它们就成了垃圾,等着垃圾回收程序的回收再利用 Java的垃圾回收机制 ...

  5. TIJ读书笔记06-终结清理和垃圾回收

    TIJ读书笔记06-终结清理和垃圾回收 finalize()方法 垃圾回收器如何工作 java的垃圾回收是由jvm来控制的.所以需要java程序员参与的部分不是很多. 但是在这里需要明白一点,java ...

  6. java 笔记(1)-—— JVM基础,内存数据,内存释放,垃圾回收,即时编译技术JIT,高精度类型

    1.java中5个存放数据的地方: (1).寄存器(Registers):位于CPU内部,是速度最快的存储区,但是数量和容量有限.在java中不能直接操作寄存器. (2).栈(Stack):栈位于通用 ...

  7. Java虚拟机学习笔记——JVM垃圾回收机制

    Java虚拟机学习笔记——JVM垃圾回收机制 Java垃圾回收基于虚拟机的自动内存管理机制,我们不需要为每一个对象进行释放内存,不容易发生内存泄漏和内存溢出问题. 但是自动内存管理机制不是万能药,我们 ...

  8. jvm学习笔记一(垃圾回收算法)

    一:垃圾回收机制的原因 java中,当没有对象引用指向原先分配给某个对象的内存时候,该内存就成为了垃圾.JVM的一个系统级线程会自动释放该内存块.垃圾回收意味着程序不再需要的对象是"无用信息 ...

  9. 《C#从现象到本质》读书笔记(五)第5章字符串第6章垃圾回收第7章异常与异常处理

    <C#从现象到本质>读书笔记(五)第5章字符串 字符串是引用类型,但如果在某方法中,将字符串传入另一方法,在另一方法内部修改,执行完之后,字符串的只并不会改变,而引用类型无论是按值传递还是 ...

随机推荐

  1. jquery的ajax提交form表单方式总结

    方法一: function AddHandlingFeeToRefund() { var AjaxURL= "../OrderManagement/AjaxModifyOrderServic ...

  2. Error:The SDK Build Tools revision (19.0.3) is too low for project ':app'. Minimum required is 19.1.

    今天更新了一下AndroidStudio, 结果编译程序时报错, 错误如下: Error:The SDK Build Tools revision (19.0.3) is too low for pr ...

  3. jTDS驱动兼容性问题

    Java连接SQL Server 2000数据库时,有两种方法: (1)通过Microsoft的JDBC驱动连接.此JDBC驱动共有三个文件,分别是mssqlserver.jar.msutil.jar ...

  4. 并发编程实践五:ReentrantLock

    ReentrantLock是一个可重入的相互排斥锁,实现了接口Lock,和synchronized相比,它们提供了同样的功能.但ReentrantLock使用更灵活.功能更强大,也更复杂.这篇文章将为 ...

  5. 14.4.1 InnoDB Startup Configuration

    14.4 InnoDB Configuration :InnoDB 配置: 14.4 InnoDB Configuration 14.4.1 InnoDB Startup Configuration ...

  6. <Win32_14>__win32控件(2)__教你自学掌握所有控件的玩法

    学习win32 API 编程,我们应该善于利用微软给我们提供的一些辅助工具,例如大家都知道的MSDN.SPY++等等. 今天在讲述之前呢,先给大家介绍一个很有用的工具——Control Spy——它的 ...

  7. Vijos P1881 闪烁的星星

    背景 星光闪耀--深蓝色空间 听说过他们的语言 沉默 暮 他们称赞深相互 描写叙述 繁星, 漫天的繁星. 繁星排成一列, 我数一数呀, 一共同拥有N仅仅小星星呢. 星星们是听话的好孩子, 小岛在指挥它 ...

  8. stm32f103 TIM1初始化--定时器应用

    //TIM1 分频 #define TIM1_DIV1 (1-1) #define TIM1_DIV2 (2-1) #define TIM1_DIV4 (4-1) #define TIM1_DIV8 ...

  9. ACM起步要点总结(转哈工大)

    首先,我想说的就是,我是一个很普通的ACMer,高中没有参加过任何计算机和数学竞赛的经历,也没有ben那样过人的天资,努力至今也未能取得什么成绩,我之所以写下这篇文章,只是希望给刚进大学或者刚进ACM ...

  10. random_shuffle (stl算法)打乱顺序 - 飞不会的日志 - 网易博客

    random_shuffle (stl算法)打乱顺序 - 飞不会的日志 - 网易博客 random_shuffle (stl算法)打乱顺序 2012-03-31 10:39:11|  分类: 算法 | ...