.NET垃圾回收笔记
名词
垃圾收集目标
- 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();
}
}
}
资料
.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垃圾回收笔记的更多相关文章
- JAVA垃圾回收笔记
一.分析GC日志 /** * @author : Hejinsheng * @date : 2019/1/18 0018 * @Description: 模拟FULL GC/YOUNG GC * -X ...
- Java内存模型与垃圾回收笔记
内存模型 栈. 局部变量(基本类型)与对象引用:线程隔离.每个方法执行时会创建一个栈帧,存储局部变量等. 堆. 对象实例:线程共享. 方法区.类信息.常量(final).静态变量.符号引用: 线程共享 ...
- python 垃圾回收笔记
目录 引用计数 python内部的引用计数机制 循环引用 调试内存泄漏 总结 python 程序在运行的时候,需要在内存中开辟出一块空间,用于存放运行时产生的临时变量:计算完成后,再将结果输出到永久性 ...
- 0030 Java学习笔记-面向对象-垃圾回收、(强、软、弱、虚)引用
垃圾回收特点 垃圾:程序运行过程中,会为对象.数组等分配内存,运行过程中或结束后,这些对象可能就没用了,没有变量再指向它们,这时候,它们就成了垃圾,等着垃圾回收程序的回收再利用 Java的垃圾回收机制 ...
- TIJ读书笔记06-终结清理和垃圾回收
TIJ读书笔记06-终结清理和垃圾回收 finalize()方法 垃圾回收器如何工作 java的垃圾回收是由jvm来控制的.所以需要java程序员参与的部分不是很多. 但是在这里需要明白一点,java ...
- java 笔记(1)-—— JVM基础,内存数据,内存释放,垃圾回收,即时编译技术JIT,高精度类型
1.java中5个存放数据的地方: (1).寄存器(Registers):位于CPU内部,是速度最快的存储区,但是数量和容量有限.在java中不能直接操作寄存器. (2).栈(Stack):栈位于通用 ...
- Java虚拟机学习笔记——JVM垃圾回收机制
Java虚拟机学习笔记——JVM垃圾回收机制 Java垃圾回收基于虚拟机的自动内存管理机制,我们不需要为每一个对象进行释放内存,不容易发生内存泄漏和内存溢出问题. 但是自动内存管理机制不是万能药,我们 ...
- jvm学习笔记一(垃圾回收算法)
一:垃圾回收机制的原因 java中,当没有对象引用指向原先分配给某个对象的内存时候,该内存就成为了垃圾.JVM的一个系统级线程会自动释放该内存块.垃圾回收意味着程序不再需要的对象是"无用信息 ...
- 《C#从现象到本质》读书笔记(五)第5章字符串第6章垃圾回收第7章异常与异常处理
<C#从现象到本质>读书笔记(五)第5章字符串 字符串是引用类型,但如果在某方法中,将字符串传入另一方法,在另一方法内部修改,执行完之后,字符串的只并不会改变,而引用类型无论是按值传递还是 ...
随机推荐
- 用yum查询想安装的软件
1.使用YUM查找软件包 命令:yum search~ 2.列出所有可安装的软件包 命令:yum list 3.列出所有可更新的软件包 命令:yum list updates 4.列出所有 ...
- JSTL解析——002——core标签库01
javaEE5之前的版本需要引用JSTL相关的jar包.tld文件等,JAEE5之后就不用这么麻烦了, 如果你的还是不能使用就去官网下载(jstl.jar和standard.jar)这两个jar包,将 ...
- 一起talk C栗子吧(第十二回:C语言实例--单链表一)
各位看官们,大家好.从今天開始,我们讲大型章回体科技小说 :C栗子.也就是C语言实例.闲话休提, 言归正转. 让我们一起talk C栗子吧! 看官们,上一回中咱们没有说详细的样例,并且是说了样例中的文 ...
- 用XCA(X Certificate and key management)可视化程序管理SSL 证书(2)--生成SSL证书请求
在上个章节中,我们提到了怎样安装XCA(X Certificate and key management)程序.这个章节我们開始正式介绍怎样用XCA生成证书请求.假设大家用过java的话.肯定知道jd ...
- wiki 3143 二叉树的前序、中序及后序遍历
先序遍历:訪问根.遍历左子树.遍历右子树,简称:DLR. 中序遍历:遍历左子树,訪问根,遍历右子树,简称:LDR. 后序遍历:遍历左子树,遍历右子树.訪问根.简称:LRD. 数组搞的: #pragma ...
- 三次握手wireshark抓包分析,成功握手和失败握手
启动 点击start出现下面的对话框 wireshark是捕获机器上的 某一块网卡的网络包,当机器上有多块网卡的时候,需要选择一个网卡进行捕获操作. 选择网卡 >主页面上,直接点击选中后star ...
- struts2错误验证
在登陆的时候一般要用错误验证功能.效果如图: 在action层的写法: this.addActionError("username或password错误"); 在jsp页面上取值: ...
- [Android学习笔记]Android调试
Eclipse Debug 快捷键: [Ctrl + Shift + B]: 添加/取消断点 [F5]:进入方法中 [F6]:单步执行 [F7]:执行完毕此方法 [F8]:继续执行,直接跳到下一个断点 ...
- java中Hashtable中的t为什么是小写(转)
因为在很多年前刚学java的时候用到Hashtable的时候比较好奇为什么第二个t是小写,这不符合sun的风格啊,整个jdk都是标准驼峰,于是带着这个疑问翻过 很多书,看多很多资料,最后的结论是: H ...
- 一致性哈希算法(consistent hashing)样例+測试。
一个简单的consistent hashing的样例,非常easy理解. 首先有一个设备类,定义了机器名和ip: public class Cache { public String name; pu ...